阻止锁定与非阻止锁定

我在这里想:如果你有2个线程执行需要同步的FAST操作,那么阻塞/上下文切换方法不是更快/更好的非阻塞方法吗?

通过非阻塞我的意思是:

while(true){if(checkAndGetTheLock())break; }

我唯一能想到的是饥饿(CPU烧坏),如果你有太多的线程在锁定周围循环。

如何平衡一种方法与另一种方法?

以下是Java Concurrency in Practice关于该主题的内容:

JVM可以通过自旋等待(重复尝试获取锁定直到成功)或通过操作系统阻止被阻塞的线程来实现阻塞。 哪个更有效取决于上下文切换开销与锁定可用之前的时间之间的关系; 对于短等待而言,旋转等待是优选的,并且对于长时间等待而言,悬挂是优选的。 一些JVM根据过去等待时间的分析数据自适应地在两者之间进行选择,但大多数只是挂起等待锁定的线程。

而且(也就是IMO,最重要的一点):

不要过分担心无竞争同步的成本。 基本机制已经非常快,JVM可以执行额外的优化,进一步降低或消除成本。 相反,将优化工作集中在实际发生锁争用的领域。

那么唯一可以确定的方法是测试它。 当谈到multithreading和性能时,你根本无法假设。