不安全的compareAndSwapInt与同步
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不安全的compareAndSwapInt与同步相关的知识,希望对你有一定的参考价值。
我发现几乎所有高级同步抽象(如Semaphore,CountDownLatch,来自java.util.concurrent的Exchanger)和并发集合都使用Unsafe中的方法(如compareAndSwapInt方法)来定义临界区。同时我预计同步块或方法将用于此目的。你能解释一下,不安全的方法(我的意思是只能原子设置一个值的方法)比同步更有效吗?为什么会这样?
如果您希望等待很长时间(例如毫秒),因为线程可能会睡着并释放CPU以执行其他工作,则使用synchronised
会更有效。
如果您希望操作很快发生,那么使用compareAndSwap
会更有效。这是因为它是一个简单的机器代码指令,只需10 ns。但是,如果资源非常满足,则该指令必须忙等待,如果它无法获得所需的值,它可能会占用CPU,直到它完成为止。
如果使用非堆内存,则可以控制共享数据的布局,并避免错误共享(多个CPU正在更新相同的缓存行)。当您有多个值可能需要单独更新时,这一点很重要。例如用于环形缓冲区。
请注意,典型JVM(例如,热点)的内部实现通常会使用比较和交换硬件指令作为synchronized
实现的一部分,如果这样的指令可用(例如,x86),而另一个常见的替代方案是LL/SC(例如,POWER,ARM)。快速路径使用比较和交换(或等效)尝试获取锁定的典型策略(如果它是空闲的,可能是一个短的spin-loop,最后如果失败回到OS级别的原始阻塞原语) (例如,futex,Events)。细节远不止于此,包括biased locking等技术,并且最终依赖于实现。
以上是关于不安全的compareAndSwapInt与同步的主要内容,如果未能解决你的问题,请参考以下文章
LinkedBlockingQueue 与ConcurrentLinkedQueue队列的不同与同