我试图从高层次上理解如何使用AbstractQueuedSynchronizer
作为构建块来构建Java并发API。我在此类中未看到synchronized
,wait()
+ notify()
的任何使用。那么如何实现线程安全代码呢?
尽管我看到unsafe
CAS操作实现了一些原子性,但这不足以拥有完全线程安全的代码。
最佳答案
Unsafe
类的记录不如JDK公开公开的类好,因此,并非所有保证其方法的保证都是显而易见的。
但是,如果您查看latest source code of AbstractQueuedSynchronizer
,您会发现它现在使用VarHandle
,其方法已被详细记录。对于compareAndSet
,文档says:
这意味着将不存在争用条件,因为对于两个并发线程,只有一个线程将更新该值,而另一个线程将失败。然后,您将获得所需的内存可见性保证。