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