mirror of
https://github.com/sjsdfg/effective-java-3rd-chinese.git
synced 2026-09-03 13:22:48 +08:00
update
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user