黑马程序员技术交流社区

标题: 【成都校区】几种单例模式实现 [打印本页]

作者: 1581750802    时间: 2019-1-24 13:52
标题: 【成都校区】几种单例模式实现
[Java] 纯文本查看 复制代码
package com.itcast.mybatis.extension.singleton;

/**
* 单例设计模式的懒汉模式
* @author NOT ME
* @create 2019/1/20 0020
*/
public class SingletonOne {

    /**
     * 单例设计模式的懒汉模式也称为延迟加载方式
     * 优点: 实现起来很简单,没有多线程安全问题
     * 缺点: 静态变量被创建就会分配内存空间,从这以后,这个static的对象便一直占据这个内存空间
     *      不管是使用还是未使用,直到类被卸载时,静态变量被销毁回收,释放所有的内存空间,会耗费内存
     */

    private static SingletonOne singletonOne = null;

    private SingletonOne() {

    }

    public static SingletonOne getInstance() {
        if (singletonOne == null) {
            singletonOne = new SingletonOne();
        }
        return singletonOne;
    }
}


package com.itcast.mybatis.extension.singleton;


/**
* 单例模式的饿汉模式
* @author NOT ME
* @create 2019/1/20 0020
*/
public class SingletonTwo {

    /**
     * 单例设计模式的饿汉模式又称为延迟加载
     * 优点: 实现起来比较简单,当第一次调用getInstance()才会创建对象,并给对象分配内存空间和初始化
     *      不使用的话,则不会创建该对象,因此在特定条件下,可以节约内存
     *
     * 缺点: 在多线程环境下,存在线程安全问题,获得的对象并不是同一个对象
     *
     */


    private static final SingletonTwo singletonTwo = new SingletonTwo();
    private SingletonTwo() {

    }

    public static SingletonTwo getInstance() {
        return singletonTwo;
    }
}



package com.itcast.mybatis.extension.singleton;

/**
* 单例设计模式的线程安全的懒汉模式
* @author NOT ME
* @create 2019/1/20 0020
*/
public class SingletonThree {

    /**
     * 线程安全的懒汉模式
     * 优点: 在多线程的情况下,能够保证线程安全
     * 缺点: 效率比较低,不是最佳的实现方式
     */

    private static SingletonThree singletonThree = null;

    private SingletonThree() {

    }

    public static SingletonThree getInstance() {
        synchronized (SingletonThree.class) {
            if (singletonThree == null) {
                singletonThree = new SingletonThree();
            }
        }
        return singletonThree;
    }
}



package com.itcast.mybatis.extension.singleton;

/**
* 单例设计模式的双检锁实现
* @author NOT ME
* @create 2019/1/20 0020
*/
public class SingletonFour {

    /**
     * 单例设计模式的双重检查锁实现方式,是最佳的单例实现
     * 多线程操作具有原子性,当判断singletonFour为空时,则会获取到锁,锁里面的操作都是原子操作,直到操作完成后返回一个
     *     正在可用的单例对象
     */

    private volatile static SingletonFour singletonFour = null;
    private SingletonFour() {

    }

    public static SingletonFour getInstance() {
        if (singletonFour == null) {
            synchronized (SingletonFour.class) {
                if (singletonFour == null) {
                    singletonFour = new SingletonFour();
                }
            }
        }
        return singletonFour;
    }
}

package com.itcast.mybatis.extension.singleton;

/**
* 单例设计模式的第五种实现方式  内部类方式的懒汉模式
* @author NOT ME
* @create 2019/1/20 0020
*/
public class SingletonFive {

    private SingletonFive() { }

    private static class SingletonInner {
        private static final SingletonFive SINGLETON_FIVE = new SingletonFive();
    }

    public static SingletonFive getInstance() {
        return SingletonInner.SINGLETON_FIVE;
    }
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2