我在java中看到了一些示例,它们在代码块上进行同步以更改某些变量,而该变量最初被声明为volatile。我在一个单例类的示例中看到,他们将唯一实例声明为可变实例,并同步初始化该实例的块……我的问题是,为什么我们在同步时声明它是易失性的,为什么我们需要同时做这两件事?其中一个对另一个还不够吗?public class SomeClass {
volatile static Object un
这就是为什么读或写长变量或双变量不是原子的原因。因为它涉及两个操作,第一个32位和第二个32位对变量的读/写。另外,从上面的段落中,我了解到如果我在方法上使用synchronized,它将使该方法具有原子性(从理论上讲)。
这意味着对易失性变量的更改对其他线程总是可见的。那么,为什么下面的内容是原子的,并且不需要同步?this.someNumber = so
我理解同步和易失性做什么以及它们在哪里使用。我刚刚学会了易失性,我很困惑我们什么时候才能使用同步而不挥发。如果我同步一个对象,我需要阻止其他线程使用同一个对象,但在大多数情况下,我会这样做来编辑对象,如果是这样的话,我需要对我正在编辑的属性具有易失性。下面的代码是关于争用条件的,我想知道为什么我从未见过有人使用易失性的on变量: this