我在这里想:如果有两个线程执行需要同步的FAST操作,那么非阻塞方法不是比阻塞/上下文切换方法更快/更好吗?
所谓非阻塞,我的意思是:
while(true){if(checkAndGetTheLock())break;}
如果有太多线程围绕锁循环,我唯一能想到的就是饥饿(CPU耗尽)。
如何平衡一种方法与另一种方法?
以下是Java并发实践对主题的介绍:
JVM可以通过旋转等待(重复尝试获取锁直到成功)或通过挂起操作系统中被阻塞的线程。哪个更有效取决于上下文切换开销和锁可用之前的时间;旋转等待更适合短等待和暂停对于长等待是优选的。一些合资企业基于过去等待的分析数据自适应地在两者之间进行选择有时,但大多数只是挂起等待锁定的线程。
还有(这是国际海事组织最重要的一点):
不要过分担心无控制同步的成本。基本机制已经很快了,JVM可以执行进一步降低或消除成本的额外优化。相反,将优化工作集中在锁争用的区域实际发生。
唯一确定的方法就是测试它。当涉及到多线程和性能时,你根本无法假设。