在并发线程访问单例模式时,可以使用双重检查锁定(Double-Checked Locking)来保证线程安全。以下是一个使用双重检查锁定的示例代码:
public class Singleton {
private volatile static Singleton instance;
private Singleton() {
// 私有构造函数
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
在上面的代码中,使用了volatile关键字来保证instance在多线程环境下的可见性。在第一次调用getInstance()方法时,会进行双重检查,第一次检查instance是否已经被实例化,如果没有实例化,则进入同步块。在同步块中再次检查instance是否已经被实例化,如果没有实例化,则进行实例化操作。
这种方式可以避免每次调用getInstance()方法时都进行同步,提高了性能。同时通过双重检查,保证了线程安全,即使在多线程环境下也能正确地返回单例对象。
需要注意的是,这种方式只适用于Java 1.5及以上版本。在Java 1.5之前,由于JVM的指令重排问题,可能会导致双重检查锁定失效,因此需要使用volatile关键字来解决这个问题。