This commit is contained in:
sjsdfg
2019-03-15 14:04:21 +08:00
parent 37fa12a8e7
commit 51a08bbe36

View File

@@ -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);