单例模式的各种写法
程序员文章站
2022-07-13 23:47:10
...
1、线程不安全的
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if (instance == null){
instance = new Singleton();
}
return instance;
}
}
2、线程安全,但是性能不是太高
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static synchronized Singleton getInstance(){
if (instance == null){
instance = new Singleton();
}
return instance;
}
}
public class Singleton {
private Singleton() {} //私有构造函数
private volatile static Singleton instance = null; //单例对象
//静态工厂方法
public static Singleton getInstance() {
if (instance == null) { //双重检测机制
synchronized (Singleton.class){ //同步锁
if (instance == null) { //双重检测机制
instance = new Singleton();
}
}
}
return instance;
}
}
3、匿名内部类形式
public class Singleton {
private Singleton(){}
private static class LazyHolder{
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance(){
return LazyHolder.INSTANCE;
}
}
4、线程安全,性能较高
public class Singleton {
private static Singleton instance;
private static byte[] lock = new byte[0];
private Singleton(){}
public static Singleton getInstance(){
if (instance == null){
synchronized (lock){
if (instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
public class Singleton {
private static Singleton instance;
private static ReentrantLock lock = new ReentrantLock();
private Singleton(){}
public static Singleton getInstance(){
if (instance == null){
lock.lock();
if (instance == null){
instance = new Singleton();
}
lock.unlock();
}
return instance;
}
}
5、枚举实现方式
public class Singleton {
private Singleton(){}
public static Singleton getInstance(){
return SingletonEnum.INSTANCE.getInstance();
}
private static enum SingletonEnum {
INSTANCE;
private Singleton singleton;
private SingletonEnum(){
singleton = new Singleton();
}
public Singleton getInstance() {
return singleton;
}
}
}
注:摘自《Java并发编程从入门到精通》
上一篇: 漫画:混乱的标记语言XHTML2/HTML5(附中文版翻译)
下一篇: 单例模式的各种写法