是否可以直接分配volatile变量线程?像AtomicReference一样安全吗?

mar*_*hon 1 java concurrency multithreading atomic

这与使用AtomicReference一样安全吗?

private volatile String myMember;

public void setMyMember(String s) { 
   myMember = s;
}
Run Code Online (Sandbox Code Playgroud)

private final AtomicReference<String> myMember = new AtomicReference<>();

public void setMyMember(String s) {
    while (true) {
        String current = myMember.get();
        if (myMember.compareAndSet(current, s))
            break;
    }
}    
Run Code Online (Sandbox Code Playgroud)

Gra*_*ray 5

您的代码是"安全的"但与AtomicReference代码不同.通常,当有人试图向列表或对象添加内容并且他们想要使用多个线程来防止竞争条件时,使用AtomicReference循环compareAndSet.

例如:

private final AtomicReference<List<String>> listRef = new AtomicReference<>();
...
while (true) {
    List<String> currentList = listRef.get();
    List<String> newList = new ArrayList<String>(currentList);
    newList.add(stringToAdd);
    // if we update the list reference, make sure we don't overwrite another one
    if (listRef.compareAndSet(currentList, newList))
        break;
}
Run Code Online (Sandbox Code Playgroud)

在你的情况下,因为你使用的是一个简单的String对象,所以只需要它就volatile可以了.这样做没有意义compareAndSet.如果你还想使用AtomicReference,那就打电话吧myMember.set(...).