单例模式的两种写法:饿汉式单例和懒汉式单例

一般我们在项目开发中有时候常会遇到数据库的连接(不使用框架),我们常会在dao类中写一些通用的方法以供后面使用。一般的做法是哪里需要操作数据库的方法哪里就会创建一个对象,然后再引用对象里面的操作方法,这样做的不好的地方就是创建的对象比较多,比较消耗内存,降低程序效率,而我们完全可以只创建一个对象,然后哪里需要哪里就直接用,无需重新创建,这就是单例模式。

一、懒汉式单例(线程安全,推荐使用)

懒汉式单例顾名思义,它是驱动型的单例模式。当某个用户(线程)需要某个对象实例时才会去创建,而再未被需要之前不会主动去创建。在一些需要自己创建的工具类时,可以将其定义为一个单例类,因为在整个项目当中工具类只需要创建一次。

优缺点: 类加载较块,但获取对象较慢(需要先创建,仅针对第一次实例化),需要进行线程同步,保证线程安全。
注意: 在这个写法中用到了两次if(singleton == null)判断语句,因为当一个线程执行完if(singleton == null)还未执行下面的语句时,有另一个线程也执行完if语句,然后再执行下面的,此时会产生多个对象,线程不安全。但是当再加一个判断语句时,当某一个线程已经创建了该对象时,另一个线程在进行执行第二个if语句时直接返回false,从而不会创建多余的对象。

public class Singleton {//简单实现一个单例模型

    private static Singleton singleton ;
    private static Object object=new Object();
    /*私有化构造函数,使得在外部不能创建对象,这是实现单例模式的关键*/
    private Singleton(){}
    /*获取object对象锁,进行线程同步,在前一个线程未释放该锁时,其他线程需等待*/
   public static Singleton geiInstance(){
        if(util==null){
            synchronized (object){
                if(util==null){
                    util=new Singleton();
                }
            }
        }
        return util;
    }

    public static void main(String[] args) {
        Singleton singleton1 = Singleton.geiInstance();
        Singleton singleton2 = Singleton.geiInstance();
        System.out.println(singleton 1==singleton 2);
    }
}
//输出:true

二、饿汉式单例

饿汉式单例即主动型单例模式,不管用户用不用得到,它都会提前实例化对象等待用户调用。

优缺点: 在类加载时就已经实例化,因此类加载较慢,但获取对象比较快,不存在线程安不安全的问题。

public class Singleton {
    private static Singleton  singleton = new Singleton();
    private Singleton(){}
    public static Singleton getSingleton(){
        return singleton;
    }
    public static void main(String[] args) {
        Singleton util1= Singleton.getSingleton();
        Singleton util2= Singleton.getSingleton();
        System.out.println(util1==util2);
    }
}
//输出:true
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章