单例模式

导读:本篇文章讲解 单例模式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一. 定义

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

二. 模式起源

三. 设计原则

四. UML图

五. 代码

5.1 饿汉式

package model.single;

/**
 * 饿汉式
 */
public class StarvingSingleton {

    private static StarvingSingleton instance = new StarvingSingleton();

    private StarvingSingleton() {
    }

    public static StarvingSingleton getInstance() {
        return instance;
    }
    
}

5.2 懒汉式

package model.single;

/**
 * 懒汉式: 单线程下安全 多线程环境下new LazySingleton()会产生多个实例
 */
public class LazySingleton {

    private static LazySingleton instance = null;

    private LazySingleton() {
    }

    public static LazySingleton getInstance() {

        // 此处多线程环境下会创建多个实例  存在安全隐患
        if (instance == null) {
            instance = new LazySingleton();
        }

        return instance;
    }

}

5.3 同步方法懒汉式

package model.single;

/**
 * 同步方法式: 多线程安全,但是效率低
 */
public class SyncSingleton {

    private static SyncSingleton instance = null;

    private SyncSingleton() {
    }

    public static synchronized SyncSingleton getInstance() {

        if (instance == null) {
            instance = new SyncSingleton();
        }

        return instance;
    }

}

5.4 双重检查锁懒汉式

package model.single;

/**
 * 双重检查锁模式
 */
public class DclSyncSingleton {

    // volatile关键字确保: 当instance变量被初始化为DclSyncSingleton实例时,多个线程正确处理该变量
    private volatile static DclSyncSingleton instance = null;

    private DclSyncSingleton() {
    }

    public static DclSyncSingleton getInstance() {

        if (null == instance) {
            synchronized (DclSyncSingleton.class) {
                if (null == instance) {
                    instance = new DclSyncSingleton();
                }
            }
        }

        return instance;
    }

}

5.5 静态内部类式

package model.single;

/**
 * 静态内部类式
 */
public class InnerClassSingleton {

    private InnerClassSingleton() {
    }

    /**
     * 内部类:持有一个静态私有的类对象
     */
    private static class LayHolder {
        private static InnerClassSingleton INSTANCE = new InnerClassSingleton();
    }

    public static InnerClassSingleton getInstance() {
        return LayHolder.INSTANCE;
    }

}

六. 感悟

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/17808.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!