单例模式

徘徊边缘 提交于 2019-12-02 05:36:43
/** * 饿汉式 在类加载时实现初始化,浪费内存 * 线程安全 * 用于访问量大,多线程访问 *  */public class Utils{    private static final Utils instanch=new Utils();    private Utils() {    }    public static Utils getInstance (){        return instanch;    }}
/** * 懒汉式 在调用时实现初始化 * 非线程安全 * 用于访问量少,单线程访问,多线程时可能会出现实例化多个对象 * eg:线程A,B同时执行到if (instance == null) { 中会有多个实例 */public class Utils {    private static Utils instance;    private Utils() {    }    public static Utils getInstance() {        if (instance == null) {            instance = new Utils();        }        return instance;    }}
/** * 懒汉式优化(DCL式) 在调用时实现初始化 * 非线程安全 * 用于访问量少,单线程访问,多线程时可能会出现实例化多个对象 * synchronized: 只允许一个线程进入特定代码段,从而避免多线程同时修改同一数据。费性能*  可能存在 获取到空的instance  eg:线程A执行到 getInstance 看的第2步(相当于半个对象因已有内存空间)线程B执行getInstance时会直接return instance;一个null对象优化如下个方法 */public class Utils {    private static Utils instance;     private Utils() { //分3步 1 分配内存空间2,初始化对象,3设置内存地址到对象    }    public static Utils getInstance() {        if(instance==null){            synchronized (Utils.class){                if (instance == null) {                    instance = new Utils();                }            }        }        return instance;    }}

/** * 懒汉式优化(DCL式) 在调用时实现初始化 * 非线程安全 * 用于访问量少,单线程访问,多线程时可能会出现实例化多个对象 * synchronized: 只允许一个线程进入特定代码段,从而避免多线程同时修改同一数据。费性能 * volatile :高并发时用volatile * 使用volatile变量能够保证:    每次读取前必须先从主内存刷新最新的值。    每次写入后必须立即同步回主内存当中。    也就是说,volatile关键字修饰的变量看到的随时是自己的最新值。线程1中对变量v的最新修改,对线程2是可见的 */
public class Utils {    private volatile static Utils instance;    private Utils() {    }    public static Utils getInstance() {        if(instance==null){            synchronized (Utils.class){                if (instance == null) {                    instance = new Utils();                }            }        }        return instance;    }}

/***   使用时加载UtilsInSide  内部类,线程安全 *    */public class Utils {    public static Utils getInstance(){        return UtilsInSide.instance;    }    private static class UtilsInSide {        private static final Utils instance=new Utils();    }}
 
 
 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!