diff --git a/docs/notes/78. 同步访问共享的可变数据.md b/docs/notes/78. 同步访问共享的可变数据.md index a8e410c..a8eeb1d 100644 --- a/docs/notes/78. 同步访问共享的可变数据.md +++ b/docs/notes/78. 同步访问共享的可变数据.md @@ -4,7 +4,7 @@   这种观点是正确的,但是它并没有说明同步的全部意义。如果没有同步,一个线程的变化就不能被其他线程看到。同步不仅可以阻止一个线程看到对象处于不一致的状态之中,它还可以保证进入同步方法或者同步代码块的每个线程,都能看到由同一个锁保护的之前所有的修改效果。 -  Java 语言规范保证读或者写一个变量是原子的( atomic ),除非这个变量的类型为 long 或者 double [JLS , 17.4, 17 .7] 。换句话说,读取一个非 long 或 double 类型的变量,可以保证返回值是某个线程保存在该变量中的, 即使多个线程在没有同步的情况下并发地修改这个变量也是如此。 +  Java 语言规范保证读或者写一个变量是原子的( atomic ),除非这个变量的类型为 long 或者 double [JLS , 17.4, 17.7] 。换句话说,读取一个非 long 或 double 类型的变量,可以保证返回值是某个线程保存在该变量中的, 即使多个线程在没有同步的情况下并发地修改这个变量也是如此。   你可能昕说过,为了提高性能,在读或写原子数据的时候,应该避免使用同步。这个建议是非常危险而错误的。虽然语言规范保证了线程在读取原子数据的时候,不会看到任意的数值,但是它并不保证一个线程写入的值对于另一个线程将是可见的。 **为了在线程之间进行可靠的通信,也为了互斥访问,同步是必要的。** 这归因于 Java 语言规范中的内存模型(memory model),它规定了一个线程所做的变化何时以及如何变成对其他线程可见[JLS ,17.4; Goetz06, 16]。 @@ -65,7 +65,7 @@ public class StopThread { Thread backgroundThread = new Thread(() -> { int i = 0; while (!stopRequested()) - i++; + i++; }); backgroundThread.start(); TimeUnit.SECONDS.sleep(1); @@ -87,7 +87,7 @@ public class StopThread { Thread backgroundThread = new Thread(() -> { int i = 0; while (!stopRequested) - i++; + i++; }); backgroundThread.start(); TimeUnit.SECONDS.sleep(1);