博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
偏向锁,轻量级锁与重量级锁的区别与膨胀
阅读量:3687 次
发布时间:2019-05-21

本文共 623 字,大约阅读时间需要 2 分钟。

线程来访问它的时候,它会偏向这个线程,此时,对象持有偏向锁。偏向第一个线程,这个线程在修改对象头成为偏向锁的时候使用CAS操作,并将

对象头中的ThreadID改成自己的ID,之后再次访问这个对象时,只需要对比ID,不需要再使用CAS在进行操作。

一旦有第二个线程访问这个对象,因为偏向锁不会主动释放,所以第二个线程可以看到对象时偏向状态,这时表明在这个对象上已经存在竞争了,检查原来持有该对象锁的线程是否依然存活,如果挂了,则可以将对象变为无锁状态,然后重新偏向新的线程,如果原来的线程依然存活,则马上执行那个线程的操作栈,检查该对象的使用情况,如果仍然需要持有偏向锁,则偏向锁升级为轻量级锁,(偏向锁就是这个时候升级为轻量级锁的)。如果不存在使用了,则可以将对象回复成无锁状态,然后重新偏向。

        轻量级锁认为竞争存在,但是竞争的程度很轻,一般两个线程对于同一个锁的操作都会错开,或者说稍微等待一下(自旋),另一个线程就会释放锁。 但是当自旋超过一定的次数,或者一个线程在持有锁,一个在自旋,又有第三个来访时,轻量级锁膨胀为重量级锁,重量级锁使除了拥有锁的线程以外的线程都阻塞,防止CPU空转。

--------------------- 
作者:暗黑BALL 
来源:CSDN 
原文:https://blog.csdn.net/choukekai/article/details/63688332 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的文章
字符串练习
查看>>
正则表达式
查看>>
springboot中的日志框架
查看>>
springboot的MVC自动配置
查看>>
正则表达式(上)
查看>>
json介绍
查看>>
借助bufio实现按行读取内容
查看>>
JVM OOM异常
查看>>
Bootstrap 栅格基本模板使用
查看>>
SpringBoot 整合Mybatis
查看>>
SpringBoot 事务的使用
查看>>
Windows 常用网络cmd命令
查看>>
Java 方法(方法重载)与数组
查看>>
Java 类、对象和构造器
查看>>
Java 三大特征:封装、继承(方法覆盖,this,super)和多态
查看>>
Layui 栅格系统、常用表单和校验与监听
查看>>
Java--顺序表插入与删除
查看>>
操作数组元素,数组赋值,卫语句,==,Array.equals(数组1,数组2),equals,循环遍历输出数组元素,增强for遍历输出元素,switch,if..else..,比较数组元素是否一致
查看>>
动态录入学生个数,录入每个数组元素,并求出数组元素的最值以及平均值
查看>>
复制数组元素,合并两个已知数组,String数组类型,增强for循环,native,Array.copyof()扩容数组创建新数组,合并数组,Array类的方法对数组进行截断或者扩容
查看>>