**单件模式:确保一个类只有一个实例,并提供一个全局访问点 **
单例模式需要私有的构造器、一个静态方法、一个静态变量,可以避免其他类再自行产生实例,ststic使这个实例可以在全局内访问。
多线程抢占单例对象数据不同步问题
1.把getInstance()变成同步(synchronized)方法
public class Singleton{
private static Singleton uniqueInstancs;
private Singleton(){
}
public static synchronized Singleton getInstance(){
if(uniqueInstancs==null){
uniqueInstances=new Singleton();
}
return uniqueInstances;
}
}
同步方法会拖垮性能。
2.使用“eagerly”创建实例,而不用延迟实例化的做法
public class Singleton{
private static Singleton uniqueInstance=new Singleton(); //访问变量前先创建实例,保证线程安全
private Singleton(){}
public static Singleton getInsatnce(){
return uniqueInstance; //直接返回
}
}
3.“双重检查加锁”,先减产是否创建了实例,没有的话只在第一次创建时同步,减少方法同步
public class Singleton{
private voiatil* static Singleton uniqueInstance;
private Singleton(){}
public static Singleton getInsatnce(){
if(uniqueInstancs==null){
synchronized(Singleton.class){
if(uniqueInstancs==null){
uniqueInstances=new Singleton();
}
}
}
return uniqueInstances;
}
}
多个类加载器问题,指定
。。