双重判断
public class TestSingleton {
private TestSingleton(){}
private static TestSingleton instance;;
public static TestSingleton getSingleton(){
if(instance==null){
synchronized(TestSingleton.class){
if(instance==null){
instance = new TestSingleton();
}
}
}
return instance;
}
}
优点:使用双重检查,很大程度上避免了不必要的锁开销,提高了执行效率。这里要注意,虽然未使用volatile关键字,但是这里的synchronized已经保证了INSTANCE写操作对其它线程读操作的可见性。
静态常量
public class TestSingleton {
private TestSingleton(){}
private static final TestSingleton instance = new TestSingleton();
public static TestSingleton getSingleton(){
return instance;
}
}
优点:实现简单,无需使用动态代码块
缺点:在类装载是完成初始化。若实例一直未被使用,会造成资源浪费。
内部静态类
public class TestSingleton {
private TestSingleton(){}
public static TestSingleton getSingleton(){
return InnerClass.Instence;
}
private static class InnerClass{
private static final TestSingleton Instence=new TestSingleton();
}
}
优点:无线程同步问题,实现了懒加载,只有调用getSingleton()才会创建实例。
参考:http://www.jasongj.com/design_pattern/singleton/