各类锁(互斥锁,自旋锁,读写锁,乐观锁,悲观锁,死锁)
互斥锁
当有一个线程要访问共享资源(临界资源)之前,会对线程访问的这段代码(临界区)进行加锁。如果在加锁之后没释放锁之前其他线程要对临界资源进行访问,则这些线程会被阻塞睡眠,直到解锁,如果解锁时有一个或者多个线程阻塞,那么这些锁上的线程就会变成就绪状态,然后第一个变为就绪状态的线程就会获取资源的使用权,并且再次加锁,其他线程继续阻塞等待。
读写锁
也叫做共享互斥锁,读模式共享,写模式互斥。有点像数据库负载均衡的读写分离模式。它有三种模式:读加锁状态,写加锁状态和不加锁状态。简单来说就是只有一个线程可以占有写模式的读写锁,但是可以有多个线程占用读模式的读写锁。
当写加锁的模式下,任何线程对其进行加锁操作都会被阻塞,直到解锁。
当在读加锁的模式下,任何线程都可以对其进行读加锁的操作,但所有试图进行写加锁操作的线程都会被阻塞。直到所有读线程解锁。但是当读线程太多时,写线程一直被阻塞显然是不对的,所以一个线程想要对其进行写加锁时,就会阻塞读加锁,先让写加锁线程加锁
自旋锁
自旋锁和互斥锁很像,唯一不同的是自旋锁访问加锁资源时,会一直循环的查看是否释放锁。这样要比互斥锁效率高很多,但是仍然需要占用CPU。所以自旋锁适用于多核的CPU。但是还有一个问题是当自旋锁递归调用的时候会造成死锁现象。所以慎重使用自旋锁。
乐观锁
这其实是一种思想,当线程去拿数据的时候,认为别的线程不会修改数据,就不上锁,但是在更新数据的时候会通过版本来判断其他线程是否修改了该数据。,如果数据被修改了就拒绝更新,之所以叫乐观锁是因为并没有加锁。
悲观锁
当线程去拿数据的时候,总假设别的线程会去修改数据,所以它每次拿数据的时候都会上锁,别的线程去拿数据的时候就会阻塞。
这两种锁一般用于数据库,当一个数据库的读操作远远大于写的操作次数时,使用乐观锁会加大数据库的吞吐量。
各类锁(互斥锁,自旋锁,读写锁,乐观锁,悲观锁,死锁)相关推荐
- 同步方法中的锁对象_互斥锁与读写锁:如何使用锁完成Go程同步?
图转自https://colobu.com/2018/12/18/dive-into-sync-mutex/ 这张图容易让人产生误解,容易让人误以为goroutine1获取的锁,只有goroutine ...
- go Mutex (互斥锁)和RWMutex(读写锁)
golang中sync包实现了两种锁Mutex (互斥锁)和RWMutex(读写锁),其中RWMutex是基于Mutex实现的,只读锁的实现使用类似引用计数器的功能. type Mutex func ...
- 面试必问!有没有比读写锁更快的锁?
面试三连 面试官:了解锁吗? 小明:了解,还经常用过. 面试官:说说synchronized和lock的区别吧 小明:synchronized是可重入锁,由于lock是一个接口,重入性取决于实现,sy ...
- mysql 乐观锁 脏读_mysql 丢失更新1和2、脏读、不可重复读和幻读 事务隔离级别 悲观锁 乐观锁...
事务是现代关系型数据库的核心之一.在多个事务并发操作数据库(多线程.网络并发等)的时候,如果没有有效的避免机制,就会出现以下几种问题: ( 第一类丢失更新 A事务撤销时,把已经提交的B事务的更新数据覆 ...
- 并发锁之二:ReentrantReadWriteLock读写锁
一.简介 读写锁是一种特殊的自旋锁,它把对共享资源对访问者划分成了读者和写者,读者只对共享资源进行访问,写者则是对共享资源进行写操作.读写锁在ReentrantLock上进行了拓展使得该锁更适合读操作 ...
- Java锁详解之改进读写锁StampedLock
文章目录 先了解一下ReentrantReadWriteLock StampedLock重要方法 StampedLock示例 StampedLock可能出现的性能问题 StampedLock原理 St ...
- Mysql存储引擎Innodb的读写锁、行级锁
读写锁 Mysql存储引擎Innodb在处理并发读或者写的时候,通过两种类型的锁来解决并发问题,这两种锁通常称为共享锁和排他锁,也叫读锁和写锁. 读锁是共享的,即多个客户端可以同时读取同一资源. 写锁 ...
- mysql悲观锁优化_MySQL数据库优化(三)—MySQL悲观锁和乐观锁(并发控制)
一.悲观锁 1.排它锁,当事务在操作数据时把这部分数据进行锁定,直到操作完毕后再解锁,其他事务操作才可操作该部分数据.这将防止其他进程读取或修改表中的数据. 2.实现:大多数情况下依靠数据库的锁机制实 ...
- mysql乐观和悲观锁实现_mysql实现乐观锁和悲观锁该怎么编写?
乐观锁和悲观锁相信大家都是知道的,这是java中的基础知识,今天我们就来看看它们两者该如何使用代码实现吧. 乐观锁实现 1).表设计 表task,分别有三个字段id,value.version 2). ...
- 锁机制有什么用?简述Hibernate的悲观锁和乐观锁机制
有些业务逻辑在执行过程中要求对数据进行排他性的访问,于是需要通过一些机制保证在此过程中数据被锁住不会被外界修改,这就是所谓的锁机制. Hibernate支持悲观锁和乐观锁两种锁机制.悲观锁,顾名思义悲 ...
最新文章
- 每日站会要关注团队目标-Scrum中文网
- springmvc静态资源;mvc:default-servlet-handler后Controller失效
- gradle 指定java版本_Eclipse使用gradle编译时,使用固定的jdk版本进行编译(修改gradle的jdk编译版本)...
- 一文掌握二代测序NGS
- 28 | 案例篇:一个SQL查询要15秒,这是怎么回事?
- win10资源管理器怎么打开_让你效率倍增的电脑神器,最强资源管理器增强工具「QTTabBar」...
- 阿里开发者招聘节 | 面试题05: 关于epoll和select的区别,哪些说法是正确的?
- 分布式系统面试 - 常见问题
- salt实现lamp自动化部署
- Binary classification - 聊聊评价指标的那些事儿【回忆篇】
- JWPlayer Uncaught Error: Invalid SRT file
- 一个架构师谈什么是架构,以及怎么成为架构师
- 使用Eclipse远程调试
- CUDA编程第五章: 共享内存常量内存
- jquery判断元素内容是否为空的方法
- 【设计】死区时间控制
- 微信定位当前城市 php,html5,javascript_微信内置浏览器如何定位用户所在城市,html5,javascript - phpStudy...
- 当前页面的video只播放一个
- 热爱穿行记穿行寻宝电脑版
- 好好的一个气质美女,怎么就变成了泼妇