单例模式
目录
定义:用来创建独一无二的,只能有一个实例的对象的入场券
作用:用于减少由于创建过多相同对象而造成的资源浪费
应用场景:常常用来管理共享资源,如数据库操作和线程池。
实现方法:
1,饿汉式
在创建变量的时候就将对象实例化,另外通过将构造器私有化来防止对象的重复创建。
优点:可以防止由于多线程操作所产生的操作
缺点:过早的创建对象可能会造成资源的浪费
public class Single {
private static final Single single=new Single();
private Single(){}
public static Single getInstance(){
return single;
}
}
2,懒汉式
当需要的时候再创建对象
优点:当需要的时候再创建对象,防止的资源的浪费
缺点:可能会因为多线程的操作而产生错误
public class Single {
private static Single single;
private Single(){};
public static Single getInstance(){
if(single==null){
single=new Single();
}
return single;
}
}
解决方法:
1,加上同步修饰符
优点:防止多线程所造成的的错误
缺点:每次调用getInstance()方法同步都会成为一种累赘
public synchronized static Single getInstance(){
if(single==null){
single=new Single();
}
return single;
}
2,双重锁定
优点:防止多线程所造成的的错误,还能降低同步所造成的累赘
缺点:volatile修饰符在1.4及更早版本中会使双重锁定失效
注意:volatile修饰符在这里是为了确保当single被创建为Single实例时,多个线程能够正确的处理single变量
public class Single {
private volatile static Single single;
private Single(){};
public static Single getIntance(){
if(single==null){
synchronized(Single.class){
if(single==null){
single=new Single();
}
}
}
return single;
}
}