Java 单例模式在多线程环境下的线程安全问题及解决方案
在多线程环境下,这段代码可能会存在线程安全问题。如果多个线程同时调用'getB()'方法,并且'o'为'null',那么可能会创建多个'B'对象,违背了单例模式的初衷。
为了解决这个问题,可以使用双重检查锁定(Double-Checked Locking)来保证线程安全。具体改进如下:
class B {
private volatile static B o;
public static B getB() {
if (o == null) {
synchronized (B.class) {
if (o == null) {
o = new B();
}
}
}
return o;
}
private B() {
// 希望只执行一次的初始化代码
}
}
在改进后的代码中,使用了双重检查锁定和'synchronized'关键字,确保在多线程环境下只会创建一个'B'对象。同时,使用'volatile'关键字修饰'o'变量,保证多线程环境下的可见性,防止指令重排序导致的问题。
这样,无论多少个线程调用'getB()'方法,都能够保证只创建一个'B'对象,并且在初始化时只执行一次初始化代码。
原文地址: http://www.cveoy.top/t/topic/2oc 著作权归作者所有。请勿转载和采集!