1

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

4

2 回答 2

0

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

另一件事是,这取决于您使用哪种 jvm。因此,以目前的形式,除了告诉您在其他地方使用 CAS 之外,您的问题并不能真正回答。

于 2013-10-08T11:48:36.867 回答
0

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

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

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

于 2013-10-08T20:06:22.353 回答