个人理解:由于在高并发里面会创建多个实例,需要对类的初始化进行改造。
下面介绍2种模式:
饿汉模式
package test;
//饿汉式单例类.在类初始化时,已经自行实例化
public class Singleton {
private Singleton() {}
private static final Singleton single = new Singleton();
//静态工厂方法
public static Singleton getInstance() {
return single;
}
}
public static void main(String[] args) {
//饿汉实现方式,结果输出是同个实例,注意上面标红的单词,它代表你不能用new 类()去初始化,或者创建一个实例
//Singleton s1=Singleton.getInstance();
//Singleton s2=Singleton.getInstance();
//下面这种方法必须把private去掉!!!输出结果是两个不同实例
//Singleton s1=new Singleton();
//Singleton s2=new Singleton();
//System.out.println(s1+" "+s2);
}
懒汉模式
调用的时候再加载
package test;
//懒汉式单例类.是在调用时才
public class Singleton {
private Singleton() {}
private static Singleton single ;
//静态工厂方法
public static Singleton getInstance() {
if(single==null){
}else{
single= new Singleton();
}
return single;
}
}
上面2种方法都是线程不安全的,所以要用synchronized来编程
package test;
//懒汉式单例类.是在调用时才
public class Singleton {
private Singleton() {}
private static Singleton single ;
//静态工厂方法
public synchronized static Singleton getInstance() {
if(single==null){
}else{
single= new Singleton();
}
return single;
}
}
但是!!!你锁住的东西太多了,一旦高并发会卡很久的,so优化
package test;
//懒汉式单例类.是在调用时才
public class Singleton {
private Singleton() {}
private static Singleton single ;
//静态工厂方法
public static Singleton getInstance() {
if(single!=null){
synchronized(Singleton.class){
if(single==null){
}else{
single= new Singleton();
}
return single;
}
}
}
}
而且可以看到里面双重判断是为了更加准确就是单一模式
但是!!!还是有缺陷:就是当其他线程已经创建之后,跳到另一个线程时,会显示已经创建实例,就没有创建了。