使用AtomicBoolean
作为非阻塞锁,使用构造对来自多个线程的非线程安全数据进行读写访问是否安全?
if (lock.compareAndSet(false, true)) {
try {
//Access non-volatile fields, non-atomic arrays and not thread-safe classes
} finally {
lock.set(false);
}
} else {
//Access denied, try again later or right now
}
此结构外无法访问数据。我几乎可以肯定它是安全的,因为不稳定的捎带效应。我是对的吗?
答案 0 :(得分:3)
高层次的考虑必须是它是否安全地排除了对关键资源的并发访问。这有效,因为AtomicBoolean
提供了必要的保证。作为重击规则,JMM的设计方式是,如果你正确地实现了高级逻辑,那么低级别的东西也是如此。
正如您在问题中所做的更详细,volatile
读取和写入排除了意外的重新排序,正如您所期望的那样(又称“捎带”)。
你基本上也在做Lock
所做的事情。 ReentrantLock
将使用int
而不是boolean
,而Lock
会提供一个等待队列,而简单的原子变量则不会。{/ p>
AbstractQueuedSynchronizer
显示了如何围绕一个原子int
变量实现该逻辑(与您的类似)。