跳转到内容

Java 编程/关键字/synchronized

来自维基教科书,开放的书籍,为开放的世界

synchronized 是一个关键字。

它标记了一个临界区临界区是指只有一个线程可以执行的代码段。因此,要进入标记的代码,线程必须同步,一次只能进入一个线程,其他线程必须等待。有关更多信息,请参见 线程同步方法[1].

synchronized 关键字可以以两种方式使用

一个 synchronized 块标记为

Example 代码段 1: 同步块。
synchronized(<object_reference>) {
   // Thread.currentThread() has a lock on object_reference. All other threads trying to access it will
   // be blocked until the current thread releases the lock.
}

标记方法 synchronized 的语法为

Example 代码段 2: 同步方法。
public synchronized void method() {
   // Thread.currentThread() has a lock on this object, i.e. a synchronized method is the same as
   // calling { synchronized(this) {…} }.
}

同步始终与一个对象相关联。如果方法是静态的,则关联的对象是类。如果方法是非静态的,则关联的对象是实例。虽然允许将 抽象 方法声明为 synchronized,但这样做没有意义,因为同步是实现的一部分,而不是声明的一部分,而抽象方法没有实现。

例如,我们可以展示一个线程安全的单例模式版本

Computer code 代码清单 1: Singleton.java
/**
 * The singleton class that can be instantiated only once with lazy instantiation
 */
public class Singleton {
    /** Static class instance */
    private volatile static Singleton instance = null;

    /**
     * Standard private constructor
     */
    private Singleton() {
        // Some initialisation
    }
   
    /**
     * Getter of the singleton instance
     * @return The only instance
     */
    public static Singleton getInstance() {
        if (instance == null) {
            // If the instance does not exist, go in time-consuming
            // section:
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }

        return instance;
    }
 }
华夏公益教科书