单例模式

单例模式

目录

image

定义:用来创建独一无二的,只能有一个实例的对象的入场券

作用:用于减少由于创建过多相同对象而造成的资源浪费

应用场景:常常用来管理共享资源,如数据库操作和线程池。

实现方法:

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;
}
}

你可能感兴趣的:(单例模式)