并发主题

jvm是如何处理锁的?

偏向锁biased:在一个并发系统中,如果系统中没有竞争情况,JVM不会从OS借用mutex(互斥执行锁)来执行锁的。 Hotspot能操作内部数据结构来模拟锁反而更有效。

比如如果同步 synchronized 部分代码没有实时咨询, JVM分配自己的所有者线程ID给这个对象作为mutex互斥锁,使用CAS 操作,如果CAS通过存储重入计数,它是偏向锁 - 最轻的JVM所做的锁类型??。没有CAS重入计数将被自己的线程当作本地变量锁住更新,如果 CAS失败,意味着另一个线程已经得到了这个锁,JVM 将会停止mutex所有者线程, 将线程上下文存储到主内存,然后检查重入计数器。

如果计数器是 0, JVM升级锁到瘦类型,否则是胖类型,(瘦胖是指等待时间,等待少锁就是瘦的). Hotspot使用同样字段存储所有者线程id在mutex对象作为缓存的唯一标识,一旦你返回mutex的标识hashcoe,它对于偏向锁将适用,即使它已经用作偏向用处。

 

瘦型Thin:这是一个简单的自旋锁spin。它有助于节省时间时,线程上下文切换时间相当小的。当一个线程试图获取一个已经被占有的Mutex时,它会旋转一段时间,直到锁将被释放。基于内部JVM旋转计数可能取决于不同的因素:有关您的应用程序由JVM收集的统计信息,使用的线程数目,CPU等等。 JVM决定,何时瘦锁变得效率低下,升级胖型锁。

 

胖型锁fat:最强'的锁类型时,但JVM请求OS的mutex时,使用OS调度引擎进行暂停或唤醒。相比以前的类型,它是非常昂贵的,因为在这种情况下,JVM每次当线程获取和释放锁时,直接与操作系统交互。

 

java多线程

Java同步或锁

Java性能调优