java锁

举报
object 发表于 2024/02/29 16:47:00 2024/02/29
【摘要】 java中存在各种各样的锁,时间久了,一些锁的特性确实记不得了,今天做个简单的总结。需要注意的是,java中常使用的一些类或者关键字,不能仅以某一类锁作为分类,可能具有多个锁标签1.乐观锁  - 悲观锁乐观锁:认为不会存在多个线程同时修改共享资源的情况,允许多个资源同时修改数据。  特点:线程自旋        实现:线程自旋 + CAS (或版本号)            实际使用:Ato...

java中存在各种各样的锁,时间久了,一些锁的特性确实记不得了,今天做个简单的总结。需要注意的是,java中常使用的一些类或者关键字,不能仅以某一类锁作为分类,可能具有多个锁标签

1.乐观锁  - 悲观锁

乐观锁:认为不会存在多个线程同时修改共享资源的情况,允许多个资源同时修改数据。

  特点:线程自旋        实现:线程自旋 + CAS (或版本号)            实际使用:AtomicInteger               优点:1.不会造成线程阻塞  2.上下文切换少,性能高               缺点:1.ABA问题 2.不适用高并发           建议:读多写少场景

悲观锁:认为总是会有多个线程同时修改共享资源的情况,不允许多个资源同时修改数据

  特点:锁竞争          实现:synchronized、ReentrantLock         实际使用:x                    优点:1.保证共享资源一致性        缺点:1.死锁 2.线程上下文切换性能低    建议:写多读少场景

2.独占锁 - 共享锁

独占锁:只允许一个线程持有锁

  特点:单个线程特有     实现:AbstractQueuedSynchronizer    实际使用:WriteLock    优点:1.单个线程持有,资源一致性    缺点:1.死锁 2.线程上下文切换性能低     建议:需要严格要求数据一致性的场景

共享锁:允许多个线程持有锁

  特点:线程共享     实现:AbstractQueuedSynchronizer   实际使用:ReadLock   优点:1.性能高           缺点:1.一致性无法保证     建议:不要求一致性的场景

  ps:这里的共享锁,听起来很空泛,既然允许多个线程同时持有,那我加锁干嘛呢,不是多此一举吗?  所以这里的共享锁一般是在某些特殊场景下出现,一般是配合独占锁来使用。  常见的就是WriteLock,ReadLock。即允许对独占锁的资源进行资源读取(前提未有线程占用写锁),防止大量读锁的线程堵塞,提高性能

3.互斥锁 - 读写锁

互斥锁(排他锁):和上面独占锁一致,独占锁是概念,互斥锁是实现。 互斥锁:synchronized、ReentrantLock

读写锁:独占锁和共享锁的一起实现。允许资源持有两种锁,读锁和写锁,根据施加的锁,进行资源读写调整。

  特点:资源存在两种锁  实现:ReentrantReadWriteLock   实际使用:xxx       优点:1.读写可调整 2.可保证数据一致性 3.性能在悲观和乐观之间     建议:适用于要求一致性高的场景且读锁多余写锁的场景

4.可重入锁 - 不可重入锁

可重入锁(递归锁):允许线程持有锁的情况,再次获取该锁

  特点:允许持续获取同一把锁  实现:synchronized       实际使用:xxx           优点:可防止自锁,死锁的情况         缺点:x                          建议:存在连续使用同一把锁的情况

不可重入锁:不允许线程持有锁的情况,再次获取该锁

   特点:锁被持有不再被再次获取    实现:x          实际使用:x          优点:x     缺点:易出现死锁           建议:x

5.公平锁 - 不公平锁

公平锁:所有锁都有机会获取锁

  特点:都能获取到锁   实现:x  实际使用 : x         优点:不存在线程获取不到锁的情况            缺点:需要维护队列,上下文切换,性能低         建议:不允许存在长时间等待的场景

不公平锁(非公平锁):可能有些锁一直无法获取锁

  特点: 不都能获取到锁    实现:x   实际使用:synchronized       优点:不需维护队列,性能高一点    缺点:可能有线程一直获取不到锁              建议:性能要求高的场景

ps:学习过程对于公平锁的解释很多都是,基于竞争锁的顺序来获取锁叫公平锁,使用队列进行维护顺序。不公平锁的描述是,获取锁的顺序是不定的,不需要维护等待队列。   那么如果有那么一种队列,维护的是线程的优先级,按照线程优先级获取队列。  这个是公平锁还是不公平锁?

todo...

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。