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