AtomicXXX.lazySet(...) 在边缘之前发生
在大多数JMM推理中使用的发生在边缘之前,AtomicXXX.lazySet(value)方法是什么意思?javadocs是纯粹的,Sun bug 6275329指出:
语义是保证写入不会与任何先前的写入重新排序,但可以通过后续操作重新排序(或者等效地,可能对其他线程不可见),直到发生其他一些易失性的写入或同步操作)。
但这不是关于HB边缘的推理,所以它让我感到困惑。这是否意味着懒惰Set()语义不能用HB边缘来表示?
更新:我会尝试具体化我的问题。我可以在以下场景中使用普通的易失性字段:
//thread 1: producer
...fill some data structure
myVolatileFlag = 1;
//thread 2: consumer
while(myVolatileFlag!=1){
//spin-wait
}
...use data structure...
在这种情况下,在消费者中使用“数据结构”是正确的,因为易失性标志写读使HB成为边缘,从而保证了生产者对“数据结构”的所有写入都将完成,并且消费者可见。但是,如果在这种情况下,我将使用AtomicInteger.lazySet/get而不是易失性的写入/读取呢?
//thread 1: producer
...fill some data structure
myAtomicFlag.lazySet(1);
//thread 2: consumer
while(myAtomicFlag.get()!=1){
//spin-wait
}
...use data structure...
它仍然是正确的吗?我还能真正关注“数据结构”值在消费者线程中的可见性吗?
这不是“从空中”的问题 - 我在LMAX Disruptor代码中看到了这种方法,在这种情况下,我不明白如何证明它是正确的......