首页 > 其他 > 详细

单例模式

时间:2017-10-12 09:49:21      阅读:237      评论:0      收藏:0      [点我收藏+]

懒汉式:

package org.burning.sport.design.pattern.singlepattern;


/**
 * 单例模式----懒汉式,在第一次调用的时候实例化自己
 *
 * (事实上,通过Java反射机制是能够实例化构造方法为private的类的,
 * 那基本上会使所有的Java单例实现失效。此问题在此处不做讨论,姑且掩耳盗铃地认为反射机制不存在。)
 */
public class Singleton {
    //私有构造器,代表不能通过在外部new来创建对象
    private Singleton(){}

    private static Singleton singleton = null;
    // 1.获取实例的静态工厂方法(线程不安全的)
    public static Singleton getInstance() {
        if(singleton == null) {
            singleton = new Singleton();
        }

        return singleton;
    }

    // 2.获取实例的静态工厂方法(线程安全的)
    public static synchronized Singleton getSafeInstance() {
        if(singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }

    // 3.双重检查锁定
    public static Singleton getSafe2Instance() {
        if(singleton == null) {
            synchronized (Singleton.class) {
                if(singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }

    // 3. 这种获取实例的方式比1,2都好,既实现了线程安全,有避免了同步带来的性能影响
    public static final Singleton getSafe3Instance() {
        return LazyHolder.INSTANCE;
    }

    private static class LazyHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
}

 

饿汉式:

package org.burning.sport.design.pattern.singlepattern;

/**
 * 单例模式----饿汉式单例
 *  饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。
 */
public class Singleton2 {
    private Singleton2(){}
    private static final Singleton2 singleton = new Singleton2();

    public static Singleton2 getInstance() {
        return singleton;
    }
}

 https://gitee.com/play-happy/base-project

单例模式

原文:http://www.cnblogs.com/happyflyingpig/p/7654354.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!