单例模式常用是Double Check
public class singletonObject{
private static singletonObject instance;
private singletonObject(){}
public static singletonObject getInstance(){
if(null==instance){
sysnchronized(singletonObject.class){
if(null==instance){
instance=new singletonObject();
}
}
}
return instance;
}
}
这个既可以实现延迟加载和性能的提高,但是会有一个危险,但实例化内容较多时,进行到一半另一个线程就返回了,这个时候就会造成空指针异常
优雅解决这个问题的三种方法:
使用关键字volatile
用来确保将变量的更新操作通知到其他线程,具体如下:
public class singletonObject{
private static volatile singletonObject instance;
private singletonObject(){}
public static singletonObject getinstance(){
if(null==instance){
sysnchronized(singletonObject.class){
if(null==sysnchronized){
instance=new singletonObject();
}
}
}
return instance;
}
}
加一个静态类来实现实例化
public class singletonObject{
private singletonObject(){}
private static class InstanceHolder{
private final static singletonObject instance=new singletonObject();
}
public static singletonObject(){
return InstanceHolder.instance;
}
}
枚举法
这个即保证了性能又绝对的安全 ,枚举是线程安全的
packagecom.dmsdbj.itoo.teachingManagement.service.impl;
importsun.swing.plaf.synth.DefaultSynthStyle;
importjava.util.stream.IntStream;
/**
*CreatedbyAdministratoron2018/4/180018.
*/
publicclassSingletonObject{
privateSingletonObject(){}
public enum Singletos{
INSTANCE;
private final SingletonObject instance;
Singletos(){
instance=new SingletonObject();
}
public SingletonObjectget Instance(){
return instance;
}
}
public static SingletonObjectget Instance(){
return Singletos.INSTANCE.getInstance();
}
public static void main(String[]args){
IntStream.rangeClosed(1,100).forEach(i->newThread(String.valueOf(i)){
@Override
public void run(){
System.out.print(SingletonObject.getInstance()+"\n");
}
}.start());
}
}
让我们多学习优秀的代码,做一个安静的优秀美男子