单例模式

/**
* 饿汉式 在类加载时实现初始化,浪费内存
* 线程安全
* 用于访问量大,多线程访问
*
*/
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();
    }
}

 


 
 
 
posted @ 2019-10-24 14:50  雨季&流年  阅读(102)  评论(0编辑  收藏  举报