并发访问AtomicMarkableReference compareandset方法和get方法

时间:2016-08-06 20:13:49

标签: java multithreading concurrency parallel-processing java.util.concurrent

Java compareAndSet()的{​​{1}}方法原子地工作。因此,没有两个这样的方法可以在同一个对象上同时运行。但是,如果其中一个线程正在执行AtomicMarkableReference方法而另一个正在同一个对象上同时执行compareAndSet()get()方法,那么这些gerReference()或{{ 1}}方法是否等待(阻止)get()方法完成?

2 个答案:

答案 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   一个小型工具包,支持单个变量上的无锁线程安全编程。

这是无锁算法。但它仍然可能取决于您的硬件