天天看点

java多线程学习(3)--单例设计模式

单例设计模式,即类只有一个实例,不能在类外部new一个对象.通过代码在类内部创建一个对象,并提供访问方法.

一般创建单例模式的步骤:

1.在本类中实例化一个对象

2.提供访问该对象的接口

3.构造函数私有化,其他类不能实例化该类对象

单例的创建方式有两种:懒汉式和饿汉式

面试一般都考懒汉式

1.饿汉式

顾名思义,就是不管你用不用到,我先给你new一个对象

代码实现:

public class SingleHun {

    //饿汉式实现

    //new一个对象
    private static final SingleHun s = new SingleHun();

    //构造函数私有化,外部不能实例化该类
    private SingleHun() {}

    //向外部提供访问接口
    public static SingleHun getInstance() {
        return s;
    }
}
           

2.懒汉式

与饿汉式相反,等你什么时候用,我就什么时候给你new对象,实例化的延时执行:

初步代码(可能出现问题):

public class SingleLazy {

    //懒汉式实现

    private static SingleLazy s = null; //这里不能用final关键字修饰
    private SingleLazy() {}
    public static SingleLazy getInstance() {

        if(s==null) {
            //这里可能会出现问题,多线程中如果有多个线程卡在if语句中,
            //就可能new出多个对象,不安全
            s = new SingleLazy();
        }
        return s;
    }

}

           

解决方式一,设置同步函数:

这种解决方式虽然简单明了,但是降低了代码效率,给函数加锁就限制了代码的执行速度

public class SingleLazy {

    //懒汉式实现

    private static SingleLazy s = null; //这里不能用final关键字修饰
    private SingleLazy() {}
    //给函数加锁,只要有一个线程进去,没出来,其他线程就不能进去
    public synchronized static SingleLazy getInstance() {

        if(s==null) {
            s = new SingleLazy();
        }
        return s;
    }

}
           

解决方式二,设置同步代码块:

public class SingleLazy {

    //懒汉式实现

    private static SingleLazy s = null; //这里不能用final关键字修饰
    private SingleLazy() {}

    public static SingleLazy getInstance() {

        if(s==null) {
            //同步代码块
            synchronized(SingleLazy.class) {
                if(s==null)
                    s=new SingleLazy();
            }
        }
        return s;
    }

}
           

继续阅读