不安全的compareAndSwapInt与同步

问题描述 投票:1回答:1

我发现几乎所有高级同步抽象(如Semaphore,CountDownLatch,来自java.util.concurrent的Exchanger)和并发集合都使用Unsafe中的方法(如compareAndSwapInt方法)来定义临界区。同时我预计同步块或方法将用于此目的。你能解释一下,不安全的方法(我的意思是只能原子设置一个值的方法)比同步更有效吗?为什么会这样?

java concurrency java.util.concurrent unsafe
1个回答
5
投票

如果您希望等待很长时间(例如毫秒),因为线程可能会睡着并释放CPU以执行其他工作,则使用synchronised会更有效。

如果您希望操作很快发生,那么使用compareAndSwap会更有效。这是因为它是一个简单的机器代码指令,只需10 ns。但是,如果资源非常满足,则该指令必须忙等待,如果它无法获得所需的值,它可能会占用CPU,直到它完成为止。

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

请注意,典型JVM(例如,热点)的内部实现通常会使用比较和交换硬件指令作为synchronized实现的一部分,如果这样的指令可用(例如,x86),而另一个常见的替代方案是LL/SC(例如,POWER,ARM)。快速路径使用比较和交换(或等效)尝试获取锁定的典型策略(如果它是空闲的,可能是一个短的spin-loop,最后如果失败回到OS级别的原始阻塞原语) (例如,futexEvents)。细节远不止于此,包括biased locking等技术,并且最终依赖于实现。

© www.soinside.com 2019 - 2024. All rights reserved.