不安全的compareAndSwapInt与同步

mvb*_*b13 1 java concurrency unsafe java.util.concurrent

我发现几乎所有高级同步抽象(例如Semaphore,CountDownLatch,java.util.concurrent中的Exchanger)和并发集合都使用Unsafe中的方法(例如compareAndSwapInt方法)来定义关键部分。同时,我希望同步块或方法将用于此目的。您能否解释一下,不安全方法(我的意思是仅可以原子设置值的方法)比同步更有效,为什么会这样呢?

Pet*_*rey 5

synchronised如果您希望等待很长时间(例如毫秒),则使用效率更高,因为线程可能会进入睡眠状态并释放CPU来执行其他工作。

compareAndSwap如果您希望操作很快发生,则使用效率更高。这是因为这是一条简单的机器代码指令,并且只需10 ns。但是,如果资源占用严重,则该指令必须忙于等待,并且如果无法获取所需的值,则它会忙于消耗CPU直到执行此操作。

如果使用堆外内存,则可以控制共享数据的布局,并避免错误共享(同一缓存行由多个CPU更新)。当您有多个值可能要独立更新时,这一点很重要。例如用于环形缓冲区。

注意,内部实现的典型JVM(例如,热点)将经常使用的比较并交换硬件指令作为部分所述的synchronized实施,如果这样的指令是可用的(例如,。86),而其他常见的替代方案是LL / SC(例如,POWER,ARM)。一种典型的策略,该策略为快速路径使用比较和交换(或等效协议)尝试获取锁(如果锁空闲),然后可能会发生短暂的自旋循环,最后如果失败则无法回到操作系统级别阻塞原语(例如futexEvents)。细节远不止于此,它包括诸如偏置锁定之类的技术,并且最终取决于实现方式。