日期:2014-05-20  浏览次数:20867 次

synchronized实现何时使用了自旋锁还是互斥锁?
怎么网上两种说法都有呢?
JVM规范有没有规定?


------解决方案--------------------
互斥锁
------解决方案--------------------
这两个完全不是相同的概念
互斥锁,一般的synchronized,ReentrantLock就是互斥锁,ReadWriteReentrantLock中的写锁也是互斥锁,读锁不是互斥锁。

当线程需要获取锁的时候,而此时锁不可用,该线程就需要等待,这个等待该如何实现呢?
1、用循环不断的轮询锁的状态,锁可用的时候就退出。这就是自旋锁,众所周知,这样里面基本不做什么事情的循环是非常耗CPU的,如果等待锁的时间很长,用这种方式是不合适的
2、利用操作系统的指令,让线程等待,当锁可用时,让线程醒过来。这种适合需要等待长时间的。如果等待的时间短,这个操作是非常耗时的。

JVM可以统计某个锁之前的等待时间,从而选择使用自旋锁还是使用操作系统指令。不过很多JVM还是使用保守的方式,大部分时候并不采用自旋锁

关于使用什么锁,jvm是没有规定的。jvm只是规定当要获得的互斥锁不可用的时候,线程需要等待。
------解决方案--------------------
这里有相关资料:http://www.ibm.com/developerworks/cn/java/j-jtp10185/
------解决方案--------------------
互斥锁 是指锁的类型
自旋锁 是指锁的实现方式

互斥锁可以用自旋来实现,自旋也可以去实现非互斥锁
------解决方案--------------------
第一次见这个东西,跟踪学习下