资讯专栏INFORMATION COLUMN

各种锁

leejan97 / 2971人阅读

摘要:各种锁公平锁和非公平锁公平锁每个线程按照调用的顺序依次获取锁获取锁之前先检查等待队列是否有线程如果没有线程尝试获取锁否则排队非公平锁线程获取锁的顺序不定与调用顺序无关直接尝试获取锁未成功再排队例子线程到达顺序先到达获取锁到达获取锁尝试获

各种锁 公平锁和非公平锁 公平锁

每个线程按照调用lock的顺序依次获取锁, 获取锁之前先检查等待队列是否有线程, 如果没有线程尝试获取锁, 否则排队

非公平锁

线程获取锁的顺序不定, 与调用lock顺序无关, 直接尝试获取锁, 未成功再排队

例子

线程到达顺序 A->B->C

A先到达获取锁

B到达获取锁, 尝试获取失败, 进入排队队列

A释放锁唤醒B, 同时C到达

公平锁

C发现等待队列中有线程, 直接进入等待队列队尾排队挂起, B获取到锁

非公平锁

情况一: C一来直接尝试获取锁, B获取锁失败, 再次进入等待队列挂起

情况二: C一来直接尝试获取锁, B获取锁成功, C进入等待队列挂起

悲观锁和乐观锁 悲观锁

每次获取数据之前先加锁, 结束之后再释放, 占据锁期间, 别人无法获取数据

乐观锁

获取数据时不加锁, 但是设定一个版本号, 执行完事务后, 与最初版本号进行比较, 如果相等说明数据没有被修改, 将版本号加一, 如果获取到的版本号小于最新版本号, 说明当前数据可能被修改过, 放弃本次操作, 重新操作

适用场景

当冲突较少发生时, 可以选择使用乐观锁, 节省了加锁的代价, 加大吞吐量; 但当冲突较多发生时, 选择乐观锁时则会经常Retry, 降低性能, 或者此时可以选用悲观锁

mysql实现 悲观锁实现
select from ... for update
乐观锁实现

在表中增加一个作为数据版本号的字段, 最好为每个需要乐观锁的字段多带带设置一个版本号, 否则可能会造成不必的冲突

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70941.html

相关文章

  • java线程同步

    摘要:只有首先获得锁的任务线程才能继续获取该对象上的多个锁。会进一步对时失败的那些线程进行阻塞操作调用操作系统的信号量此段来摘自别处。提供了多样化的同步,比如有时间限制的同步,可以被的同步的同步是不能的等。 各种方法 1、synchronized方法。 public synchronized void save(){} 2、synchronized代码块。 synchronized(obj...

    endless_road 评论0 收藏0
  • 你和阿里资深架构师之间,差的不仅仅是年龄(进阶必看)

    摘要:导读阅读本文需要有足够的时间,笔者会由浅到深带你一步一步了解一个资深架构师所要掌握的各类知识点,你也可以按照文章中所列的知识体系对比自身,对自己进行查漏补缺,觉得本文对你有帮助的话,可以点赞关注一下。目录一基础篇二进阶篇三高级篇四架构篇五扩 导读:阅读本文需要有足够的时间,笔者会由浅到深带你一步一步了解一个资深架构师所要掌握的各类知识点,你也可以按照文章中所列的知识体系对比自身,对自己...

    huaixiaoz 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<