java中单例模式的写法有很多,但是有一部分不是线程安全的,其中一种线程安全的推荐写法如下:
1.无参单例:
public class SingletonTest {
private SingletonTest() {
}
public static SingletonTest getInstance() {
return Singleton.INSTANCE;
}
private static class Singleton {
private static final SingletonTest INSTANCE = new SingletonTest();
private Singleton() {
}
}
}
无参单例在使用时,直接调用SingletonTest.getInstance()方法即可。
2.有参单例:
import java.util.concurrent.atomic.AtomicBoolean;
public class SingletonTest {
// 是否已经初始化
private static AtomicBoolean initialized = new AtomicBoolean(false);
// 单例入参
private String param;
private SingletonTest() {
}
public static SingletonTest getInstance() {
return Singleton.INSTANCE;
}
public static void initialize(String param) {
if (initialized.compareAndSet(false, true)) {
getInstance().onInit(param);
}
}
private void onInit(String param) {
this.param = param;
}
private static class Singleton {
static final SingletonTest INSTANCE = new SingletonTest();
private Singleton() {
}
}
}
有参单例在使用时,需要先调用一次SingletonTest.initialize(String param)方法进行初始化,以后直接调用SingletonTest.getInstance()方法即可。