Java 编程/关键字/synchronized
外观
synchronized
是一个关键字。
它标记了一个临界区。临界区是指只有一个线程可以执行的代码段。因此,要进入标记的代码,线程必须同步,一次只能进入一个线程,其他线程必须等待。有关更多信息,请参见 线程同步方法 或 [1].
synchronized
关键字可以以两种方式使用
- 创建一个
synchronized
块 - 标记一个方法为
synchronized
一个 synchronized
块标记为
代码段 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
的语法为
代码段 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
,但这样做没有意义,因为同步是实现的一部分,而不是声明的一部分,而抽象方法没有实现。
例如,我们可以展示一个线程安全的单例模式版本
代码清单 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;
}
}
|