zoukankan      html  css  js  c++  java
  • 单例模式

    /**
    * 饿汉式 在类加载时实现初始化,浪费内存
    * 线程安全
    * 用于访问量大,多线程访问
    *
    */
    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();
        }
    }
    
    
    
    
    
     
     
     
  • 相关阅读:
    Mysql的select加锁分析
    浅析Kubernetes的工作原理
    HTTP/2部署使用
    Amazon新一代云端关系数据库Aurora
    为什么 kubernetes 天然适合微服务
    深入解读Service Mesh背后的技术细节
    微服务的接入层设计与动静资源隔离
    Prim算法和Kruskal算法介绍
    DAG及拓扑排序
    BFS和DFS
  • 原文地址:https://www.cnblogs.com/zhou2016/p/11732158.html
Copyright © 2011-2022 走看看