我试图从更高的层次上理解java的并发API是如何使用AbstractQueuedSynchronizer构建的。我在这个类中没有看到任何synchronized、wait() + notify()的用法。那么如何才能实现线程安全的代码呢?
虽然我看到unsafe的CAS操作实现了一些原子性,但这还不足以拥有完全线程安全的代码。
发布于 2019-07-07 04:58:06
Unsafe类没有像JDK公开的类那样有文档记录,所以并不是它的方法提供的所有保证都是显而易见的。
但是,如果您查看latest source code of AbstractQueuedSynchronizer,就会发现它现在使用的是VarHandle,它的方法有详细的文档记录。对于compareAndSet,请参阅文档says
使用setVolatile的内存语义将变量的值自动设置为newValue (java.lang.Object...)如果变量的当前值(称为见证值)通过内存语义getVolatile(java.lang.Object...)访问,则对expectedValue执行==操作。
这意味着不会有竞争条件,因为对于两个并发线程,只有一个线程将更新值,另一个线程将失败。您将获得所需的内存可见性保证。
https://stackoverflow.com/questions/56914381
复制相似问题