文档

Java™ 教程-Java Tutorials 中文版
同步方法
Trail: Essential Classes
Lesson: Concurrency
Section: Synchronization

同步方法

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;
    }
}

如果 countSynchronizedCounter 的实例,那么使这些方法同步有两个影响:

注意,构造函数不能同步 — 将 synchronized 关键字与构造函数一起使用是一种语法错误。同步构造函数没有意义,因为只有创建对象的线程在构造时才能访问它。


警告: 构造将在线程之间共享的对象时,要非常小心,对该对象的引用不能过早“泄漏”。例如,假设你要维护一个名为 instancesList,其中包含每个类的实例。你可能想要将以下行添加到构造函数中:
instances.add(this);
但是其他线程可以在构造对象完成之前使用 instances 来访问对象。

同步方法启用了一种简单的策略来防止线程干扰和内存一致性错误:如果一个对象对多个线程可见,则对该对象变量的所有读取或写入都是通过 synchronized 方法完成的。(一个重要的例外:final 字段,它在在构造对象后无法修改,因此一旦构造了对象,可以通过非同步方法安全地读取)此策略有效,但可能会出现 liveness 问题,我们将在本课后面看到。


Previous page: Memory Consistency Errors
Next page: Intrinsic Locks and Synchronization