夜话JAVA设计模式之单例模式(单件模式Singleton)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aa13541394765/article/details/82119584

单例模式也叫单件模式,就是确保一个类只有一个实例,并提供一个全局访问点。

       设计成单例即把某个类设计成我们自己管理的单独实例,避免实例对象的重复创建,我们只有通过单例类的全局访问点获取实例。

下面来看金典的几种单例模式java代码实现:

 1、饿汉模式

/**
 * 饿汉模式(创建和运行负担小,占用内存小时使用)
 * @author tangquanbin
 * @date 2018/08/27 21:44
 */
public class Singleton1 {

    private static Singleton1 instance = new Singleton1();
    private Singleton1(){}
    public static Singleton1 getInstance(){
        return instance;
    }

}

2、懒汉模式

/**
 * 懒汉模式
 * (懒汉模式并没有考虑线程安全问题,
 * 在多个线程可能会并发调用它的getInstance()方法,
 * 导致创建多个实例.)
 * @author tangquanbin
 * @date 2018/08/27 22:14
 */
public class Singleton2 {
    private static  Singleton2 instance ;
    private Singleton2(){}
    public static Singleton2 getInstance(){
        if (instance ==null) {
            instance = new Singleton2();
        }
        return instance;
    }
}

3、懒汉模式处理多线程

/**
 *
 * 懒汉模式(处理多线程)synchronized同步会降低性能。
 * @author tangquanbin
 * @date 2018/08/27 22:21
 */
public class Singleton3 {
    private  static  Singleton3 instance ;
    private Singleton3(){}
    public static synchronized Singleton3 getInstance(){
        if (instance == null){
            instance = new Singleton3();
        }
        return instance;
    }
}

4、用“双重检查加锁”,在getIntance()中减少使用同步

/**
 * 用“双重检查加锁”,在getIntance()中减少使用同步
 * 利用双重检查加锁,首先检查是否实例已经创建,如果没有才同步。
 * 这样只有第一次才会同步。
 * @author tangquanbin
 * @date 2018/08/27 22:28
 */
public class Singleton4 {
    private volatile static  Singleton4 instance;

    private Singleton4(){}

    public static Singleton4 getInstance(){
        //如果实例不存在,进入同步区
        if (instance == null){
            //只有第一次才执行
            synchronized (Singleton4.class){
                //进入区块再检查一次
                if (instance == null){
                    instance = new Singleton4();
                }
            }
        }
        return instance;
    }

}

volatile 关键字解释:https://mp.csdn.net/postedit/82120326

猜你喜欢

转载自blog.csdn.net/aa13541394765/article/details/82119584