Java compareAndSet()
的{{1}}方法原子地工作。因此,没有两个这样的方法可以在同一个对象上同时运行。但是,如果其中一个线程正在执行AtomicMarkableReference
方法而另一个正在同一个对象上同时执行compareAndSet()
或get()
方法,那么这些gerReference()
或{{ 1}}方法是否等待(阻止)get()
方法完成?
答案 0 :(得分:0)
实际上,compareAndSet()
是CAS operation(由其名称暗示),因此它是非阻塞的,并且两个线程可以同时调用它,但实现保证结果是正确的。
这也意味着get()
和getReference()
都是非阻塞操作。他们只是读取volatile字段的值而没有额外的同步。
答案 1 :(得分:0)
当compareAndSet()方法完成时,这两个方法中没有一个会等待。
查看其源代码:
public V getReference() {
return pair.reference;
}
public V get(boolean[] markHolder) {
Pair<V> pair = this.pair;
markHolder[0] = pair.mark;
return pair.reference;
}
public boolean compareAndSet(V expectedReference,
V newReference,
boolean expectedMark,
boolean newMark) {
Pair<V> current = pair;
return
expectedReference == current.reference &&
expectedMark == current.mark &&
((newReference == current.reference &&
newMark == current.mark) ||
casPair(current, Pair.of(newReference, newMark)));
}
private boolean casPair(Pair<V> cmp, Pair<V> val) {
return UNSAFE.compareAndSwapObject(this, pairOffset, cmp, val);
}
没有任何代码可以阻止线程。
请阅读课程的the description of the package。
包java.util.concurrent.atomic 一个小型工具包,支持单个变量上的无锁线程安全编程。
这是无锁算法。但它仍然可能取决于您的硬件