小编Jam*_*ins的帖子

原子变量是否保证内存可见性?

关于内存可见性的小问题.

CodeSample1:

class CustomLock {

    private boolean locked = false;

    public boolean lock() {
        if(!locked) {
            locked = true;
            return true;
        }
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码在多线程环境中容易出错,首先是因为"if-then-act"不是原子的,其次是因为潜在的内存可见性问题,例如threadA将字段设置为true,但是threadB是后来希望读取该字段的值可能看不到,仍然看到值false.

最简单的解决方案是使用synchronized关键字,如CodeSample2中所示.

CodeSample2:

class CustomLock {

    private boolean locked = false;

    public synchronized boolean lock() {
        if(!locked) {
            locked = true;
            return true;
        }
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在如果我希望使用原子变量,例如,AtomicBoolean(问题适用于所有原子变量),

CodeSample3:

   public static class CustomLock {
    private AtomicBoolean locked = new AtomicBoolean(false);

    public boolean lock() {
        return locked.compareAndSet(false, true);
    }
}
Run Code Online (Sandbox Code Playgroud)

除了更好的性能考虑之外,我们可以看到现在我们使用AtomicBoolean 实现了与CodeSample1的"if-then-act"类似的逻辑.逻辑上代码的作用并不重要, …

java concurrency multithreading atomicity memory-visibility

7
推荐指数
1
解决办法
714
查看次数

读取和写入变量的原子性

我刚刚在这里读了一个问题,并且阅读了@JB Nizet最评价的答案,我感到困惑......根据答案,在下面的代码中,

private int a=0;

public void foo(){
  int temp=35;
  a=28;
  a=temp;
}
Run Code Online (Sandbox Code Playgroud)

a=28; 是原子操作.

在我在#1读过一些其他的问题和答案,信息是不同的,说a=28;不是一个原子操作,因为第一右操作数的读操作时发生,则写操作发生,并且每个这两个操作是原子的,但整个任务不是(说实话,这就是我认为它的工作方式).

那怎么样a=temp;?它a=28;与原子性有什么不同?

顺便说一下,我知道volatile和double需要对它们进行原子读/写操作,只是对我上面写的内容感到困惑.

有人可以详细说明吗?

谢谢..

java atomicity

1
推荐指数
1
解决办法
119
查看次数