这里只写两种最常用的方式,且线程安全的:
一、静态内部类方式
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
这种方式同样利用了classloder的机制来保证初始化instance时只有一个线程
二、枚举方式
public class SingletonObject {
private SingletonObject(){}
private enum Singleton{
INSTANCE;
private final SingletonObject instance;
Singleton(){
instance=new SingletonObject();
}
public SingletonObject getInstance(){
return instance;
}
}
public static SingletonObject getInstance(){
return Singleton.INSTANCE.getInstance();
}
public static void main(String[] args){
IntStream.rangeClosed(1,100).forEach(i->new Thread(String.valueOf(i)){
@Override
public void run(){
System.out.println(SingletonObject.getInstance());
}
}.start());
}
}
这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊,不过要注意enum是1.5版本后才引入的类型