Java 什么是原子?

Java 什么是原子?,java,multithreading,Java,Multithreading,什么是原子?因为我必须选择某种语言来更清楚地阐述我的问题,所以我会选择Java。我知道原子意味着什么都做或者什么都不做。所以说我有以下几点 public class Myclass { private boolean progress; public void setProgress(boolean progress) { this.progress = progress; } public boolean getProgress() {

什么是原子?因为我必须选择某种语言来更清楚地阐述我的问题,所以我会选择Java。我知道原子意味着什么都做或者什么都不做。所以说我有以下几点

public class Myclass {

    private boolean progress;

    public void setProgress(boolean progress) {
        this.progress = progress;
    }

    public boolean getProgress() {
       return progress;
    }

}
现在,以下哪项是线程安全的或原子的,或者两者都是?请将每一行作为单独的代码处理

     -------------------
     getProgress(); // 
     ------------------

     ----------------------
     setProgress(true); //
     ----------------------

     -------------------
     getProgress()
     setProgress();
     -------------------

     --------------------
     setProgress();
     getProgress();
     --------------------
在java中使用AtomicReference有什么意义

我认为它们都不是原子的,因为函数调用不是原子操作。但是一旦你在一个函数中,分配一个布尔值是原子的(只是那一行),返回它不是原子的

为了确保螺纹安全,请查看以下内容:

基本上,“progress”的旧值可能缓存在cpu中,因此即使在没有同步赋值(AtomicBoolean或synchronized getter/setter)的情况下为其分配一个新值也是原子的(仅此=行)它是线程安全的,但是可能存在内存一致性错误,因此您可能希望声明该变量为volatile,以便其他线程可以看到最新的值。

由此:

我认为它们都不是原子的,因为函数调用不是原子操作。但是一旦你在一个函数中,分配一个布尔值是原子的(只是那一行),返回它不是原子的

为了确保螺纹安全,请查看以下内容:


基本上,“progress”的旧值可能缓存在cpu中,因此即使在没有同步赋值(AtomicBoolean或synchronized getter/setter)的情况下为其分配一个新值也是原子的(仅此=行)它是线程安全的,但是可能存在内存一致性错误,因此您可能希望声明该变量volatile,以便其他线程可以看到最新的值。

由于
progress
不是
volatile
,因此该类不是线程安全的。完成此操作后,该类应该是线程安全的。至于原子操作:定义了两个原子操作:除
long
s和
double
s之外的任何基本字段和引用字段的读写,以及
volatile
字段的读写。@Turing85,
AtomicXxxxxxx
类除了这两个之外还有一些额外的原子操作。例如,
atomic.compareAndSet(expected,new)
测试变量是否等于
expected
,如果是,则将其设置为
new
,所有这些都在一个原子步骤中。@Turing85我们讨论的是不同的抽象级别。我说的是Java编程语言,你说的是硬件指令。在我关注硬件指令的特定序列的时候,我已经编写了大量代码,但没有一个是用Java编写的。由于
progress
不是
volatile
,因此该类不是线程安全的。完成此操作后,该类应该是线程安全的。至于原子操作:定义了两个原子操作:除
long
s和
double
s之外的任何基本字段和引用字段的读写,以及
volatile
字段的读写。@Turing85,
AtomicXxxxxxx
类除了这两个之外还有一些额外的原子操作。例如,
atomic.compareAndSet(expected,new)
测试变量是否等于
expected
,如果是,则将其设置为
new
,所有这些都在一个原子步骤中。@Turing85我们讨论的是不同的抽象级别。我说的是Java编程语言,你说的是硬件指令。在我关注硬件指令的特定序列的时候,我已经编写了大量代码,但没有一个是用Java编写的。