锁(升级过程、乐观锁与悲观锁、读写锁、死锁、synchronized与其他锁的区别)

Java的锁状态包括无锁、偏向锁、轻量级锁和重量级锁,这四种状态会随着竞争升级。偏向锁在无竞争时减少锁获取的开销,轻量级锁适用于短暂同步场景。当锁升级为重量级锁时,其他线程会被挂起。锁升级过程不可逆,以提高效率。自旋锁在竞争不激烈时避免阻塞,但在高并发下会转为重量级锁。读写锁允许多个读取者并行,但写入者独占。死锁是多进程互相等待资源导致的僵局,防止死锁需破坏四个必要条件。synchronized关键字提供同步控制,保证内存可见性和原子性,但可能导致阻塞。相比synchronized,Lock接口提供更细粒度的控制,如可中断、公平性选择,但需手动释放。
摘要由CSDN通过智能技术生成

参考:https://www.cnblogs.com/mingyueyy/p/13054296.html
https://www.cnblogs.com/aspirant/p/11470858.html
在Java中,锁的状态总共有四种,级别由低到高依次为:无状态锁、偏向锁、轻量级锁、重量级锁,这四种锁状态分别代表什么,为什么会有锁升级?其实在 JDK 1.6之前,synchronized 还是一个重量级锁,是一个效率比较低下的锁,但是在JDK 1.6后,Jvm为了提高锁的获取与释放效率,对(synchronized )进行了优化,引入了 偏向锁 和 轻量级锁 ,从此以后锁的状态就有了四种(无锁、偏向锁、轻量级锁、重量级锁),并且四种状态会随着竞争的情况逐渐升级,而且是不可逆的过程,即不可降级,也就是说只能进行锁升级,不能锁降级。这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效率

在这里插入图片描述锁的升级过程: 当多个线程抢占同一资源时,其中某个线程获得到一个偏向锁,这时如果过来其他线程也访问这个共享资源,这时偏向锁会升级为轻量级锁,当其他线程再次尝试访问资源后,轻量级锁会升级为自旋锁,这时其他线程不会再主动获得资源,而是由锁自旋,看自己的锁是否被释放掉,如果释放掉了他会通知其他线程来获得锁,如果多次自旋后自己的锁还是没有被释放则升级为重量级锁,这时其他线程会被挂起。锁升级过程适用于低并发,当高并发时其他线程应直接被挂起。

为什么会有这四种锁机制,因为在多线程并发的过程中,如果一个线程持有锁且很快就要执行完成,另一个线程来临,如果让第二个线程阻塞的话,代价有点大,要重新走到就绪–>运行状态中去。所以,出现了这四种锁机制。
偏向锁: 当一个线程访问对象时,它会偏向这个线程,此时对象持有偏向锁。偏向此时访问它的第一个线程,这个线程将对象头中的ThreadID改为自己的ID,之后再次访问这个对象的时候,只需要对比ID,不需要再使用CAS

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值