Java多线程与锁

Java多线程与锁

锁分类

顺序划分

名称说明
公平锁线程不会饿死,效率低
非公平锁部分线程会饿死,效率高

注意事项

  • synchronized是非公平锁,并且它无法实现公平锁
  • 公平锁可以通过new ReentrantLock(true)来实现;非公平锁可以通过new ReentrantLock(false)或者默认构造函数new ReentrantLock()实现

多线程划分

名称说明
互斥锁对应 ------> 悲观锁
非互斥锁对应 ------> 乐观锁

注意事项

  • synchronized就是互斥锁

递归划分

名称说明
可重入锁允许进入自己持有的锁
不可重入锁不允许进入自己持有的锁,需释放锁

编译划分

名称说明
锁消除代码要求同步,但被检测到无需加锁
锁粗化同步块代码范围不要太大,避免在没有线程竞争的场景下导致性能损耗

使用位置划分

名称说明
类锁使用字节码文件作为锁(.class)
对象锁使用对象作为锁(this)

设计理念划分

名称说明
悲观锁认为多线程下会认为都会修改数据
乐观锁认为多线程下不会修改数据,CAS无锁算法

数据库划分

名称说明
共享锁读锁
排它锁写锁

效率划分

名称说明
无锁
偏向锁单线程访问,自动获取锁
轻量级锁多线程访问,自旋获取锁,不阻塞
重量级锁多线程访问,自旋获取锁,但自旋一定次数后变为阻塞,性能低

注意事项

  • 自旋锁:循环获取锁,减少上下文切换,但消耗CPU

并发划分

名称说明
死锁多线程资源竞争导致互相等待,阻塞
活锁不断尝试获取锁,不阻塞

存储划分

名称说明
分段锁分段加锁,提高并发

注意事项

  • jdk8之前的ConcurrentHashMap 的分段锁(Segment)
  • jdk8之后采用CAS+synchronized。通过hashCode计算到索引后对数据分段加锁

相关参考

https://www.cnblogs.com/zt007/p/10456926.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值