A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马