此Java教程是针对JDK 8编写的。本页面描述的示例和实践未利用后续版本中引入的改进,并可能使用不再可用的技术。
有关Java SE 9及以后版本中更新的语言功能的摘要,请参见Java语言更改。
有关所有JDK版本的新功能、增强功能以及已删除或不推荐使用的选项,请参见JDK发行说明。
Java编程语言提供了两种基本的同步习语:同步方法和同步语句。其中较复杂的同步语句将在下一节中介绍。本节讲述的是同步方法。
要使方法同步,只需在其声明中添加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
字段,在对象构造完成后不能修改,可以通过非同步方法安全地读取该字段)。这种策略是有效的,但可能在活性方面存在问题,我们将在本课程后面看到。