Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
Java 编程语言提供两种基本的同步习惯用法:synchronized methods (同步方法) 和 synchronized statements (同步语句)。同步语句在两者中更复杂,将在下一节描述。本节介绍同步方法。
要使方法同步,只需将 synchronized
关键字添加到其声明中:
public class SynchronizedCounter { private int c = 0; public synchronized void increment() { c++; } public synchronized void decrement() { c--; } public synchronized int value() { return c; } }
如果 count
是 SynchronizedCounter
的实例,那么使这些方法同步有两个影响:
注意,构造函数不能同步 将 synchronized
关键字与构造函数一起使用是一种语法错误。同步构造函数没有意义,因为只有创建对象的线程在构造时才能访问它。
instances
的 List
,其中包含每个类的实例。你可能想要将以下行添加到构造函数中:
instances.add(this);
instances
来访问对象。
同步方法启用了一种简单的策略来防止线程干扰和内存一致性错误:如果一个对象对多个线程可见,则对该对象变量的所有读取或写入都是通过 synchronized
方法完成的。(一个重要的例外:final
字段,它在在构造对象后无法修改,因此一旦构造了对象,可以通过非同步方法安全地读取)此策略有效,但可能会出现 liveness 问题,我们将在本课后面看到。