繁体   English   中英

用于非线程安全数据的AtomicBoolean保护(易失性捎带)

[英]AtomicBoolean guard for not thread-safe data (volatile piggybacking)

使用AtomicBoolean可以安全地使用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
}

在此结构之外无法访问数据。 我几乎可以肯定它是安全的,因为不稳定的捎带效应。 我对吗?

高级别的考虑因素必须是它是否安全地排除了对关键资源的并发访问。 这可以作为AtomicBoolean提供必要的保证。 作为重击规则,JMM的设计方式是,如果正确实现高级逻辑,那么低级别的东西也是如此。

正如您在问题中所做的更详细, volatile读取和写入排除了意外的重新排序,正如您所期望的那样(又称“捎带”)。

你基本上也在做Lock做的事情。 ReentrantLock将使用int而不是boolean ,而Lock s提供一个等待队列,而简单的原子变量则不会。

AbstractQueuedSynchronizer显示了如何围绕一个原子int变量实现该逻辑(类似于您的逻辑)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM