使对象私有化
类初始化的时候立即加载该对象
提供获取该对象的方法,没有sysnchronized,效率高
1.
private T07(){
?
}
2.
private static T07 instance=new T07();
3.
public static T07 getInstance(){
return instance;
}
缺点,如果开辟空间,将造成空间浪费,不管用到没有都会开辟空间。不能延时加载
优点:线程安全,调用效率高
私有化构造器
类初始化的时候不立即加载该对象
有sysnchronized,效率不高
1.
private T08(){
?
}
2.
private static T08 instance;
3.
public static synchronized T08 getInstance(){
if (instance==null){
instance=new T08();
}
return instance;
优点:线程安全,可以延时加载
缺点:调用效率不高
把锁的位置变了,不建议使用,极端情况容易出错
private T09(){
?
}
private static T09 instance;
?
public static T09 getInstance(){
if (instance==null){
synchronized (T09.class) {
instance = new T09();
}
}
return instance;
}
线程安全,且用final保证只有一个实例存在
private T10(){};
private static class InnerClass{
private static final T10 instance=new T10();
}
public static T10 getInstance(){
return InnerClass.instance;
}
改进:1,监测对象是否被创建
private T09(){
synchronized (T09.class){
if (instance!=null){
throw new RuntimeException("不要试图用反射破坏单例模式");
}
}
}
2.进一步改进,已经很安全了 不过反射还可以破坏boolean的值
private static boolean flag=false;
private T09(){
?
synchronized (T09.class){
if (flag=false){
flag=true;
}
else {
throw new RuntimeException("不要试图用反射破坏单例模式");
}
}
}
简单高效安全
public enum T11 {
INSTANCE;
public T11 getInstance(){
return INSTANCE;
}
}
原文:https://www.cnblogs.com/ltdh/p/12402347.html