以下是 Java Concurrency in Practice 关于此主题的内容:
JVM可以通过旋转等待(反复尝试获取锁直到成功)来实现阻塞,也可以通过在操作系统中挂起阻塞的线程来实现阻塞。哪种效率更高取决于上下文切换开销与锁定可用时间之间的关系。对于短暂的等待,最好使用自旋等待;对于长时间的等待,最好使用暂停。一些JVM根据过去等待时间的分析数据在两者之间进行自适应选择,但是大多数JVM只是挂起线程等待锁定。
还有(这是IMO最重要的一点):
不要过分担心无竞争的同步的代价。基本机制已经相当快,并且JVM可以执行其他优化,从而进一步降低或消除成本。相反,将优化工作集中在实际发生锁争用的区域上。



