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