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