我了解volatile变量只保证可见性,不应用于原子/复合操作。然而,我认为我在某个地方读到过,如果只有一个线程在进行值的更新(在单个操作中),它也可以使用。这是正确的吗?
所以,如果两个线程正在更新volatile变量,比如布尔标志,这是线程安全的吗?
我了解volatile变量只保证可见性,不应用于原子/复合操作。然而,我认为我在某个地方读到过,如果只有一个线程在进行值的更新(在单个操作中),它也可以使用。这是正确的吗?
所以,如果两个线程正在更新volatile变量,比如布尔标志,这是线程安全的吗?
volatile int[] a = { 0 };
a[0]++; // not thread safe even if you have only 1 writer.
a
的写操作以及仅针对a
的操作是易失性的。而指向a
的任何内容都不是易失性的。这与final
没有区别。final int[] a = { 0 };
a = null; // cannot do this
a[0] = 1; // compiles fine, is not final.
flag = true; // ok, provided no thread sets it to false.
flag = !flag; // not ok.
x++;
。AtomicInteger 使用 compareAndSwap 操作。 - Peter Lawreyvolatile boolean isPaused
。我的线程检查并看到它没有暂停,所以它做了一些工作;稍后,它再次检查并看到它仍然没有暂停。在这两个操作之间,如果有人暂停然后再次取消暂停,它可能并不在意。 - yshavit