文档

Java™ 教程
隐藏目录
同步方法
教程:Java基础类
课程:并发
章节:同步

同步方法

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

如果countSynchronizedCounter的一个实例,则使这些方法同步有两个效果:

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


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

同步方法提供了一种简单的策略来防止线程干扰和内存一致性错误:如果一个对象对多个线程可见,那么对该对象变量的所有读写操作都通过synchronized方法进行。 (一个重要的例外是final字段,在对象构造完成后不能修改,可以通过非同步方法安全地读取该字段)。这种策略是有效的,但可能在活性方面存在问题,我们将在本课程后面看到。


上一页: 内存一致性错误
下一页: 内在锁和同步