首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

共享锁和排他锁 linux

共享锁和排他锁基础概念

共享锁(Shared Lock)

  • 允许多个事务同时读取同一数据项,但阻止其他事务获取排他锁。
  • 通常用于读操作,允许多个读操作并发执行。

排他锁(Exclusive Lock)

  • 只允许一个事务持有锁,并阻止其他事务获取任何类型的锁(包括共享锁和排他锁)。
  • 通常用于写操作,确保在写操作期间数据的一致性和完整性。

相关优势

共享锁的优势

  • 提高并发性,允许多个读操作同时进行,减少等待时间。
  • 适用于读多写少的场景,提高系统整体性能。

排他锁的优势

  • 确保数据的一致性,在写操作期间防止其他事务修改数据。
  • 避免数据冲突和不一致的问题。

类型与应用场景

共享锁的应用场景

  • 数据库中的读操作,如SELECT语句。
  • 文件系统的共享读取。

排他锁的应用场景

  • 数据库中的写操作,如INSERT、UPDATE、DELETE语句。
  • 文件系统的独占写入。

遇到问题及解决方法

常见问题

  1. 死锁:两个或多个事务互相等待对方释放锁,导致程序无法继续执行。
  2. 性能瓶颈:过多的锁可能导致系统性能下降。

解决方法

  1. 死锁预防
    • 使用锁超时机制,设置一个合理的锁等待时间。
    • 按照固定的顺序获取锁,避免循环等待。
  • 性能优化
    • 减少锁的粒度,尽量只锁定必要的数据部分。
    • 使用乐观锁或无锁算法,在某些场景下可以提高并发性能。

示例代码(Linux文件系统)

代码语言:txt
复制
# 使用fcntl系统调用实现共享锁和排他锁

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    int fd = open("example.txt", O_RDWR);
    if (fd == -1) {
        perror("open");
        return 1;
    }

    // 获取共享锁
    struct flock fl;
    fl.l_type = F_RDLCK;  // 共享锁
    fl.l_whence = SEEK_SET;
    fl.l_start = 0;
    fl.l_len = 0;
    if (fcntl(fd, F_SETLKW, &fl) == -1) {
        perror("fcntl");
        close(fd);
        return 1;
    }

    // 读取文件内容
    char buffer[100];
    read(fd, buffer, sizeof(buffer));
    printf("Read: %s\n", buffer);

    // 释放共享锁
    fl.l_type = F_UNLCK;
    if (fcntl(fd, F_SETLK, &fl) == -1) {
        perror("fcntl");
        close(fd);
        return 1;
    }

    // 获取排他锁
    fl.l_type = F_WRLCK;  // 排他锁
    if (fcntl(fd, F_SETLKW, &fl) == -1) {
        perror("fcntl");
        close(fd);
        return 1;
    }

    // 写入文件内容
    const char *new_content = "New content";
    write(fd, new_content, strlen(new_content));

    // 释放排他锁
    fl.l_type = F_UNLCK;
    if (fcntl(fd, F_SETLK, &fl) == -1) {
        perror("fcntl");
        close(fd);
        return 1;
    }

    close(fd);
    return 0;
}

参考链接

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

mysql共享锁与排他锁

mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流。...排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改...会查询到一条数据,现在打开另一个查询窗口,对同一数据分别使用排他查和共享锁查询两种方式查询 排他查 ?...我们看到开了排他锁查询和共享锁查询都会处于阻塞状态,因为id=1的数据已经被加上了排他锁,此处阻塞是等待排他锁释放。 如果我们直接使用以下查询呢 ? ?...然后我们提交数据,释放排他锁看下修改后的数据,此时可用排他查,共享查和普通查询, 因为事务提交后该行数据释放排他锁,下面就只显示普通查询,其他的同学们自己去验证。 ? ?

1.8K20

✅什么是排他锁、共享锁、意向锁

共享锁共享锁,又被称为读锁,是由读取操作所创建的一种锁。在此期间,其他用户可以同时读取数据,但在数据上未释放所有共享锁之前,任何事务均无法对其进行修改(即获取数据的排他锁)。...一旦事务T对数据A加上共享锁,其他事务只能对A再加共享锁,而无法加排他锁。获得共享锁的事务仅可读取数据,不可修改数据。SELECT ......当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请共享锁;否则会被阻塞。其他线程也可以读取已被共享锁保护的表,且这些线程读取的是同一版本的数据。排他锁排他锁又称为写锁。...意向锁在MySQL的InnoDB引擎中,支持多种锁级别,其中包括行级锁和表级锁。当多个事务需要访问同一共享资源时,如果每个事务都直接请求获取锁,可能会发生相互阻塞的情况,甚至可能导致死锁的产生。...意向锁有两种类型:意向共享锁和意向排他锁。意向共享锁:表示事务打算在资源上设置共享锁(读锁)。通常用于表明事务计划读取资源,并希望在读取时不会有其他事务设置排他锁。

54711
  • MySQL 意向共享锁、意向排他锁、死锁

    除了挨个检查,没有更好的办法,这就导致效率低下的问题 我们这里学习的意向共享锁和意向排他锁就是用来解决,由于需要加表锁而去挨个遍历数据,确定是否有某些数据被加了行锁,而导致的效率低下问题。...作用就是快速判断表里是否有记录被加锁 二、意向共享锁和意向排他锁(表锁而非行锁) 意向锁的作用:为了可以更快速的获取表锁 意向共享锁(IS锁):事务在给一行记录加共享锁前,必须先取得该表的IS锁 意向排他锁...分析事务1获取行X锁和事务2获取表S锁: 首先事务1需要给表的第10行数据加X锁,于是InnoDB存储引擎自动给整张表加上了IX锁。...操作 设置自动提交 以及 可重复读隔离级别,开启事务 查询一下表数据,在可重复读隔离级别使用的是MVCC提供的快照读,并没有加锁 事务1获取id=7的排他锁,事务2获取id=8的排他锁 事务1再次获取id...=8的排他锁,发生阻塞 事务2再次获取id=7的排他锁 此时由于MySQL Server检测到发生了死锁,于是解除事务1的阻塞,进行事务1的rollback,释放其占有的行锁,于是事务2成功获取id=7

    1K40

    MySQL:表级锁、行级锁、共享锁、排他锁、乐观锁、悲观锁

    一文读懂所有锁,了解他们的优缺点和使用场景。 表级锁与行级锁 表级锁: table-level locking,锁住整个表。 开销小,加锁快。 不会死锁(一次性加载所需的所有表)。...InnoDB引擎支持表级锁和行级锁,默认为行级锁。 共享锁与排他锁 共享锁: 有称之为S锁、读锁。...当前线程对共享资源加共享锁,其他线程可以读取此资源、可以继续追加共享锁,但是不能修改此资源、不能追加排他锁。...语法:select id from t_table in share mode; 多个共享锁可以共存,共享锁与排他锁不能共存。 排他锁: 又称之为X锁、写锁。...当前线程对共享资源加排他锁,其他线程不允许读取此资源,不允许追加共享锁,不允许修改此资源,不允许追加排他锁。

    1.1K20

    《深入理解共享锁lock in share mode排他锁for update区别》

    共享锁:又称读锁(lock in share mode),例如select,当上锁之后,另一个线程只可以读,不可以修改。...排他锁:又称写锁(for update),例如update,insert,delete,上锁之后,另一个线程不可以读和修改。 锁的前提有两个:1、必须是mysql的innoDb表。...说到共享锁和排他锁,就会想到悲观锁,这两个都属于数据库带的悲观锁,乐观锁不是数据库带的。...悲观锁:总是觉得数据随时被人更改,此次操作会对数据造成冲突,与java里的sychronized和reentrantlock悲观锁类似,效率比较低。...uid = '1' LOCK IN SHARE MODE; 这时候事务先不commit,开启的另一个数据库,同样执行上面两个sql,会发现,不管有没有执行commit,都能够查询,不会阻塞,这就是共享锁

    93220

    MySQL锁、加锁机制(超详细)—— 锁分类、全局锁、共享锁、排他锁;表锁、元数据锁、意向锁;行锁、间隙锁、临键锁;乐观锁、悲观锁

    文章目录一、概述1.1 MySQL锁的由来1.2 锁定义1.3 锁分类二、共享锁与排他锁2.1 共享锁(S锁)2.2 排他锁(X锁)2.3 MySQL锁的释放三、全局锁3.1 介绍 3.2 语法 3.3...因此从这个实验中可以得知:共享锁也具备排他性,会排斥其他尝试写的线程,当有线程尝试修改同一数据时会陷入阻塞,直至持有共享锁的事务结束才能继续执行2.2 排他锁(X锁)上面简单的了解了共享锁之后,紧着来看看排他锁...引擎中,获取表级别的共享锁和排他锁的方式,但这里的关键词其实叫做READ、WEITE,翻译过来也就是读、写的意思,因此关于共享锁就是读锁、排他锁就是写锁的说法,估计就是因此而来的。...排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。...,因此很多时候都会出现冲突,但对于表级锁,咱们只需要关注共享意向锁和共享排他锁即可,其他的大多数为MySQL的隐式锁(在这里,共享意向锁和排他意向锁,也可以理解为MyISAM中的表读锁和表写锁)。

    12.4K810

    linux读写锁_共享内存读写锁

    读写锁其实还是一种锁,是给一段临界区代码加锁,但是此加锁是在进行写操作的时候才会互斥,而在进行读的时候是可以共享的进行访问临界区的 ps:读写锁本质上是一种自旋锁 二、为什么需要读写锁?...而读的机会却是非常多的,此公共数据的操作基本都是读,如果每次操作都给此段代码加锁,太浪费时间了而且也很浪费资源,降低程序的效率,因为读操作不会修改数据,只是做一些查询,所以在读的时候不用给此段代码加锁,可以共享的访问...,只有涉及到写的时候,互斥的访问就好了 三、读写锁的行为 读写之间是互斥的—–>读的时候写阻塞,写的时候读阻塞,而且读和写在竞争锁的时候,写会优先得到锁 四、自旋锁&挂起等待是锁?...1.一种交易场所(存放数据的地方):可以是变量、链表、数组或其他数据结构 2.两种角色:读操作和写操作 3.三种关系:(1)读和读之间没有关系 (2) 写和写之间是互斥关系...(3)读和写之间是同步互斥关系 ps:同步---->读和写在同时竞争锁的时候,写会优先的得到锁 互斥---->读的时候写阻塞,写的时候读阻塞 4.相关函数 (1)

    6.2K11

    【MySQL-25】万字总结<锁>——(全局锁&行级锁&表级锁)【共享锁,排他锁】【间隙锁,临键锁】【表锁,元数据锁,意向锁】

    表达:S 【1】【行锁】(共享锁,排他锁) 1.共享锁,排他锁机制介绍 InnoDB实现了以下两种类型的行锁: 共享锁(S): 允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。...(共享锁之间是兼容的 ,共享锁与排他锁互斥) 排他锁(X): 允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。...(一个数据有了排他锁,就与其他共享锁和排他锁互斥) 2.不同SQL下,行锁的情况 分成两种,一种是增删改;另一种是查询 3.演示行锁 默认情况下,InnODB在 REPEATABLE READ事务隔离级别运行...B: 我们想加一个表锁,我们先看有无意向锁,再看所要加的表锁与原来的意向锁是否兼容(读/写锁) ,不兼容则进入阻塞状态,直到线程A提交 2.意向锁的相关语法(意向共享锁&意向排他锁)(包含语法和演示)...意向共享锁(IS): 与表锁共享锁(read)兼容 , 与表锁排它锁(write)互斥 意向排他锁(IX): 与表锁共享锁(read)及排它锁(write)都互斥 。

    13510

    MySQL表锁、行锁、排它锁和共享锁

    此时会放弃使用索引,因此也不会使用行锁,而是使用表锁,比如对一些很小的表,MySQL就不会去使用索引 三、排它锁(Exclusive)和共享锁(Shared) 排它锁,又称为X锁,写锁 共享锁,又称为...,阻塞了 我们尝试给id=7的数据加上共享锁,还是阻塞了 再获取id=8的共享锁和排它锁 但是可以成功获取id=8的共享锁和排它锁 总结:不同事务之间对于数据的锁,只有SS锁可以共存,XX、SX、XS都不能共存...因为现在name走的是索引, 通过zhangsan在辅助索引树上找到它所在行记录的id是7,然后到主键索引树上,获取对应行记录的排他锁(MySQL Server会根据情况,在主键索引树和辅助索引树上加锁...这条记录的索引项 事务2在辅助索引树上找zhangsan,找到对应的主键值,然后去主键索引树找到相应的记录,但是发现这行记录已经被共享锁锁住了,事务2可以获取共享锁,但是不能获取排他锁 我们用主键索引id...表级锁还是行级锁说的是锁的粒度,共享锁和排他锁说的是锁的性质,不管是表锁还是行锁,都有共享锁和排他锁的区分

    29540

    利用LockSupport实现互斥锁和共享锁

    LockSupport是一个非常底层的API,我们利用其可以做很多事情,本文将利用LockSupport实现互斥锁和共享锁。...Lock 在JDK中已经提供了很多种锁的实现,原生的synchronized(优先推荐使用),juc中的ReentrantLock等,本文不纠结synchronized和ReentrantLock的实现...newCondition();在锁上新建Condition 以上的关于锁的语义稍微复杂了点,特别是相应中断部分和newCondition部分,所以这次实现上简化了Lock的语义如下: void...AtomicInteger,利用了CAS来维持锁的状态 共享锁 public class ShareLock implements Lock { private volatile Set<Thread...don't own this lock."); } state.getAndIncrement(); } } 总结 以上利用了LockSupport来实现了互斥锁和共享锁

    1K20

    独占锁(写锁)共享锁(读锁)互斥锁

    独占锁:指该锁一次只能被一个线程所持有。对ReentrantLock和Synchronized而言都是独占锁 共享锁:指该锁可被多个线程所持有。...对ReentrantReadWriteLock其读锁是共享锁,其写锁是独占锁。 读锁的共享锁可保证并发读是非常高效的,读写,写读,写写的过程是互斥的。...使用方法 声明一个读写锁 如果需要独占锁则加从可重入读写锁里得到写锁 写锁demo 如果需要共享锁则加从可重入读写锁里得到读锁 读锁demo ReentrantReadWriteLock实现原理简单分析...ReentrantReadWriteLock 的核心是由一个基于AQS的同步器 Sync 构成,然后由其扩展出 ReadLock (共享锁), WriteLock (排它锁)所组成。...是基于AQS实现的,在AQS中核心是state字段和双端队列,那么一个一个问题来分析。

    1.4K30

    java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁

    1.3 Java 中的一些公平锁和非公平锁java 中的 ReentrantLock,默认是非公平锁,当参数 fair 为 true 时,就是公平锁。...独占锁)、读锁(共享锁)和互斥锁4.1 概述独占锁: 指该锁一次只能被一个线程所持有。...对ReentrantLock和Synchronized而言都是独占锁。 共享锁: 指该锁可被多个线程所持有。 对ReentrantReadWriteLock其读锁是共享锁,其写锁是独占锁。...读锁的共享锁可保证并发读是非常高效的,读写,写读,写写的过程是互斥的。...myCache.get(temp + ""); }, String.valueOf(i)).start(); } }}4.2.2 加锁后:写入时正常,不会中断;读取时,可以共享锁

    23310

    MySQL中的锁(表锁、行锁,共享锁,排它锁,间隙锁)

    排他锁(X):又称写锁。允许获取排他锁的事务更新数据,阻止其他事务取得相同的数据集共享读锁和排他写锁。...对于排他锁大家的理解可能就有些差别,我当初就犯了一个错误,以为排他锁锁住一行数据后,其他事务就不能读取和修改该行数据,其实不是这样的。...意向共享锁(IS):事务打算给数据行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。 意向排他锁(IX):事务打算给数据行加排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。...事务可以通过以下语句显式给记录集加共享锁或排他锁: 共享锁(S):mysql SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。...对于MyISAM的表锁,主要讨论了以下几点: (1)共享读锁(S)之间是兼容的,但共享读锁(S)与排他写锁(X)之间,以及排他写锁(X)之间是互斥的,也就是说读和写是串行的。

    2.5K30

    最全Java锁详解:独享锁共享锁+公平锁非公平锁+乐观锁悲观锁

    当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则返回V。...最全Java锁详解:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁 3.典型应用: java jdk并发包中的ReentrantLock可以指定构造函数的boolean类型来创建公平锁和非公平锁(...独享锁与共享锁也是通过AQS来实现的,通过实现不同的方法,来实现独享或者共享。...最全Java锁详解:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁 concurrent包的实现结构如上图所示,AQS、非阻塞数据结构和原子变量类等基础类都是基于volatile变量的读/写和CAS...实现,而像Lock、同步器、阻塞队列、Executor和并发容器等高层类又是基于基础类实现。

    67120

    理解AbstractQueuedSynchronizer提供的独占锁和共享锁语义

    ,完全是使用Java语言层面功能配合上轻量级的CAS自旋锁来构建的抽象同步器,总的来说AQS里面包含了二套api语义一种是独占锁,另一种是共享锁。...最终就会返回true,如果失败,先调用 addWaiter(Node.EXCLUSIVE)方法,这个方法的作用是: 将返回false的线程加入到AQS的阻塞队列里面,这里面先初始化一个Node节点,把当前线线程和锁模式...AQS共享锁的申请和释放流程 这里以CountDownLatch的await分析:首先在构造函数里面我们需要传入一个阻塞的线程个数这里假设为3,在构造函数里面会设置AQS的state字段值为3。...简单的来说共享锁的释放类似,排队的人,第一个告诉第二个你可以执行了,然后第二个完事,告诉第三个依次类推直到所有的共享锁得到释放。...总结 借用Java并发编程的艺术里面术语来说,锁是面向使用者的,而AQS则是面向实现者也或开发者,AQS抽象了锁的状态管理,同步队列的,等待与唤醒等功能,简化了锁的实现方式,从而很好的隔离了使用者和实现者所关注的重点

    96120

    AQS之共享锁

    先简单总结一个AQS的特性 双向链表,有头节点和尾节点,FIFO,尾进头出,每个线程会被封装成一个Node 状态state,被volatile关键字修饰 独占模式下:获取锁后state值加1,释放锁后...state值减1,通过CAS原子操作加减,state==0表可以获取锁,state>1代表锁重入 共享模式下,state>0代表可以获取锁,同步器初始化的时候,会给sate设置一个初始化,这个值代表同时允许多少个线程获取锁...共享模式下, tryAcquireShared返回值的特点是:小于0代表获取锁失败;等于0代表本次获取锁成功,但随后的获取将返回失败,也就是此刻这是共享模式下的最后一把锁,除非接下来有人释放锁,否则你获取不了...1 : -1; } 和之前的独占模式一样,还是模板模式,也就是说,想实现一个基于共享锁的同步器,只需要重写tryAcquireShared和tryReleaseShared方法。...,共享锁代表在同一时刻可以有多个线程获取锁,具体有几个线程由用户自己决定;而独占锁代表同一个时刻只能由一个线程获取锁 即然同一时刻可以有多个线程获取锁,那在释放锁的时候,怎么尽快的唤醒其它阻塞的节点呢?

    69410
    领券