阻止锁定与非阻塞锁定

时间:2012-02-27 17:35:13

标签: java multithreading concurrency concurrent-programming

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

非阻塞我的意思是:

while(true){     if(checkAndGetTheLock())中断;   }

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

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

2 个答案:

答案 0 :(得分:5)

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

  

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

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

  

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

答案 1 :(得分:1)

确定的唯一方法是测试它。谈到多线程和性能,你根本无法假设。