JAVA锁的膨胀过程

news/2024/11/9 0:32:49/

为什么80%的码农都做不了架构师?>>>   hot3.png

首先简单说下先偏向锁、轻量级锁、重量级锁三者各自的应用场景:

  • 偏向锁:只有一个线程进入临界区;
  • 轻量级锁:多个线程交替进入临界区
  • 重量级锁:多个线程同时进入临界区。

锁膨胀过程:


上图跟下面这个解析基本相同:

偏向所锁,轻量级锁都是乐观锁,重量级锁是悲观锁。
一个对象刚开始实例化的时候,没有任何线程来访问它的时候。它是可偏向的,意味着,它现在认为只可能有一个线程来访问它,所以当第一个
线程来访问它的时候,它会偏向这个线程,此时,对象持有偏向锁。偏向第一个线程,这个线程在修改对象头成为偏向锁的时候使用CAS操作,并将
对象头中的ThreadID改成自己的ID,之后再次访问这个对象时,只需要对比ID,不需要再使用CAS在进行操作。
一旦有第二个线程访问这个对象,因为偏向锁不会主动释放,所以第二个线程可以看到对象时偏向状态,这时表明在这个对象上已经存在竞争了,检查原来持有该对象锁的线程是否依然存活,如果挂了,则可以将对象变为无锁状态,然后重新偏向新的线程,如果原来的线程依然存活,则马上执行那个线程的操作栈,检查该对象的使用情况,如果仍然需要持有偏向锁,则偏向锁升级为轻量级锁,( 偏向锁就是这个时候升级为轻量级锁的)。如果不存在使用了,则可以将对象回复成无锁状态,然后重新偏向。
轻量级锁认为竞争存在,但是竞争的程度很轻,一般两个线程对于同一个锁的操作都会错开,或者说稍微等待一下(自旋),另一个线程就会释放锁。 但是当自旋超过一定的次数,或者一个线程在持有锁,一个在自旋,又有第三个来访时,轻量级锁膨胀为重量级锁,重量级锁使除了拥有锁的线程以外的线程都阻塞,防止CPU空转。

转载于:https://my.oschina.net/hosee/blog/2878328


http://www.ppmy.cn/news/662168.html

相关文章

ConcurrentHashMap 分段锁

ConcurrentHashMap 继承自AbstractMap类&#xff08;AbstractMap实现了Map接口&#xff09;&#xff0c;用来替换其他线程安全的Map容器。例如&#xff1a; Hashtable 和Collections.synchronizedMap(new HashMap<String,String>())&#xff1b; 另外&#xff0c;说到Co…

behavios

什么是behavios&#xff1f; behaviors 是小程序中&#xff0c;用于实现组件间代码共享的特性&#xff0c;类似于 Vue.js 中的 “mixins”。 behaviors 的工作方式&#xff1a; 每个 behavior 可以包含一组属性、数据、生命周期函数和方法。组件引用它时&#xff0c;它的属性…

Shapes

系列文章 SFML-windows 篇 SFML-Events explained 篇 SFML-Keyboard, mouse and joystick 篇 SFML-Using OpenGL in a SFML window 篇 SFML-Drawing 2D stuff 篇 SFML-Shapes 篇 SFML-Sprites and textures 篇 文章目录 系列文章一、Introduction二、Common shape properties颜…

ConcurrentHashMap 总结( 上 )

来源&#xff1a;Hosee&#xff0c; my.oschina.net/hosee/blog/675884 并发编程实践中&#xff0c;ConcurrentHashMap是一个经常被使用的数据结构&#xff0c;相比于Hashtable以及Collections.synchronizedMap()&#xff0c;ConcurrentHashMap在线程安全的基础上提供了更好的写…

跨域小结(为什么form表单提交没有跨域问题,但ajax提交有跨域问题)

原文链接&#xff1a;https://www.zhihu.com/question/31592553 ------------------------------------- ------------------------------------------- ------------------------------------ 跨域springmvc http://blog.csdn.net/wabiaozia/article/details/52778335 跨域…

预测算法-三次指数平滑法(Holt-Winters)

指数平滑 一次指数平滑 一次指数平滑法是一种特殊的加权平均法&#xff0c;对本期观察值和本期预测值赋予不同的权重&#xff0c;求得下一期预测值的方法。这种方法既不需要存储全部历史数据&#xff0c;也不需要存储一组数据&#xff0c;从而可以大大减少数据存储问题。其通…

Search

Search 简介 什么时Search Transwarp Search基于开源的Elasticsearch进行开发&#xff0c;在其架构的基础上进行了多种功能优化&#xff0c;并通过Esdrive实现了SQL交互方式。Transwarp Search是一个可扩展的分布式全文搜索和分析引擎。 在TDH中Search主要扮演两个角色。首先…

Sence

■ 关于Scene 一个Scene类(javafx.scene.Scene)对象&#xff0c;是整个Scene的根节点(root) 简单讲&#xff0c;就是所有在窗体里可见的组件都必须包含在scene里 scene只有设置在stage里&#xff0c;它所包含的组件才能显示在窗体 ■ 创建Scene Label lb new Label("t…