如何在Java中实现同步块?

时间:2013-10-08 11:46:15

标签: java concurrency synchronization compare-and-swap

在某些时候线程会竞争监视器,此时一个线程应该赢,Java是否使用内置在CPU中的原子CAS操作来实现这些监视器的获取,如果不是这样的话?

2 个答案:

答案 0 :(得分:0)

我不这么认为,因为在concurrent包中你可以找到内部使用CAS的Atomic*类。

另一件事是它取决于你使用什么样的jvm。因此,就目前的形式而言,除了告诉你CAS被用于elswhere之外,你的问题并不是真正的问题。

答案 1 :(得分:0)

CAS是使所有并发在硬件级别工作的原因。如果要在所有线程中更改内存中的一个值,CAS是最快的方法;任何其他技术也将使用CAS。因此,对于快速更改,CAS是可行的方法。但是,如果要更改100个甚至5个值,则最好使用同步。它会做一个CAS来锁定监视器而另一个用来解锁它,但其余的是正常的内存读写,比CAS快得多。当然,您确实锁定了监视器,这可能会挂起其他线程,从而减慢程序速度并可能浪费CPU。

更大的担忧是,在Java中,任何CAS(或读/写易失性和同步/非同步)都伴随着其他线程的内存视图是最新的。当你编写一个volatile时,读取它的线程会看到通过编写线程所做的所有内存更改。这涉及将寄存器值转储到内存,刷新缓存,更新缓存以及将数据放回寄存器。但是这些成本与CAS并行,所以如果你有一个想通了,你也得到了另一个想法。

我认为,从程序员的角度来看,基本思想是使用volatile或atomic操作进行单次读写和多次同步 - 如果则没有其他令人信服的理由选择一个而不是另一个。