原子整数,长,布尔值但是,有什么不同的情况可能存在这种种族条件?

最好的祝福,
Keshav

有帮助吗?

解决方案

AFAIK参考不受种族条件的约束 long, ,其中下部和上4个字节以两个不同的步骤更新)。如Slak所指出的那样,唯一的关键案例是 compareAndSet 本质上不是原子。这很少与本机引用一起使用,但它是一个已知的成语 AtomicReference 当需要一次更新两个(或更多)逻辑上的变量时。 实践中的Java并发, ,第15.3.1节为此发布了一个示例 AtomicReference 要在一个原子操作中更新两个变量(存储在简单类中)。

存在的主要原因 AtomicReference - 除了接口的一致性 - IS 能见度安全出版. 。从这个意义上讲,原子变量是“更好的 volatile".

其他提示

类似的操作 ++ 受比赛条件的约束,因为它们涉及多个谨慎操作(提取,增量,商店)。

设置参考(a = b)是一个单一的操作,因此不受种族条件的影响。

参考类型的操作(a.someMethod())可以做他们想做的事情,并且可能会或可能不会受到种族条件的影响。

为了学习目的,我使用AtomicReference编写了ContrentLinkqueue。

      package concurrent.AtomicE;

      import java.util.concurrent.atomic.AtomicReference;

     public class ConcurrentLinkQueue<V> {
       private final AtomicReference<Node> firstNodePointer = new AtomicReference<Node>();

   public void fastOffer(final V data){
    final Node<V> newNode = new Node<V>(data,Thread.currentThread().getName());
    System.out.println(newNode);
    AtomicReference<Node> pointer = firstNodePointer;
    for(;;){
        if(pointer.get() == null){
            if(pointer.compareAndSet(null,newNode)){
                return;
            }
        }
        pointer = pointer.get().getNext();
    }
}

private static class Node<V>{
    private AtomicReference<Node> next = new AtomicReference<Node>();
    private volatile V data = null;
    private String threadName = "";

    Node(V data1,String threadName){
        this.data = data1;
        this.threadName = threadName;
    }

    @Override
    public String toString() {
        return  "threadName=" + threadName +
                ", data=" + data;
    }

    private AtomicReference<Node> getNext() {
        return next;
    }

    private void setNext(AtomicReference<Node> next) {
        this.next = next;
    }

    private V getData() {
        return data;
    }

    private void setData(V data) {
        this.data = data;
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top