Java volatile变量问题

tet*_*eto 9 java concurrency multithreading

阅读这篇关于Java并发的DZone文章我想知道是否有以下代码:


    private volatile List list;
    private final Lock lock = new ReentrantLock();

    public void update(List newList) {
        ImmutableList l = new ImmutableList().addAll(newList);
        lock.lock();
        list = l;
        lock.unlock();
    }

    public List get() {
        return list;
    }
Run Code Online (Sandbox Code Playgroud)

相当于:


    private volatile List list;

    public void update(List newList) {
        ImmutableList l = new ImmutableList().addAll(newList); 
        list = l;
    }

    public List get() {
        return list;
    }
Run Code Online (Sandbox Code Playgroud)

为简洁起见,省略了try {} finally {}块.我假设ImmutableList类是一个真正不可变的数据结构,它拥有自己的数据,例如google-collections库中提供的数据.由于列表变量是易变的,基本上正在进行的是即时复制,只是跳过使用锁是不安全的?

Kev*_*vin 6

在这个非常具体的例子中,我认为你可以没有锁定变量重新分配.

一般来说,我认为你最好使用AtomicReference而不是volatile变量,因为内存一致性效果是相同的,意图更清晰.