【学习笔记】单例模式

来源:互联网 发布:u盘如何恢复数据 编辑:程序博客网 时间:2024/05/19 22:03

前言

本文来自《Head Fist 设计模式》一书的实例,这里仅仅是个人笔记记录

Demo1

记得我第一次自己写的情况是直接下面的写法,但是多线程下就不经用了

    /**    * 缺点多线程下,会出现无法维持单例的情况    */    public class SingletonDemo_1    {        private static SingletonDemo_1 mInstance;        public static SingletonDemo_1 getInstance(){            if(null == mInstance) {                mInstance = new SingletonDemo_1();            }            return mInstance;        }    }

Demo2

这个方法我没用过,我是一步到位到最佳实现方法

       /**    *虽然解决了线程同步问题,但是每次调用getInstance都需要同步效率大大降低    */    public class SingletonDemo_2    {        private static SingletonDemo_2 mInstance;        // synchronized 关键字        public static synchronized SingletonDemo_2 getInstance(){            if(null == mInstance) {                mInstance = new SingletonDemo_2();            }            return mInstance;        }    }

最佳实例

目前我的项目单例模式都是下面的使用,稳定

public class SingletonDemo {    /**    * 推荐方法    */    // volatile 双重检查加锁,确保多线程正确处理mInstance初始化    private volatile static SingletonDemo mInstance;    public static SingletonDemo getInstance(){        if(null == mInstance) {            // 线程同步位置放在这里最合适不过了            synchronized(SingletonDemo.class) {                // 进入区块再检查一次如果仍旧为空,才创建                if(null == mInstance) {                    mInstance = new SingletonDemo();                }            }        }        return mInstance;    }    public static void main(String[] args) {        System.out.println("Hello World!");    }}