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();
        }
    }
    
    
    
    
    
     
     
     
  • 相关阅读:
    15. DML, DDL, LOGON 触发器
    5. 跟踪标记 (Trace Flag) 834, 845 对内存页行为的影响
    4. 跟踪标记 (Trace Flag) 610 对索引组织表(IOT)最小化日志
    14. 类似正则表达式的字符处理问题
    01. SELECT显示和PRINT打印超长的字符
    3. 跟踪标记 (Trace Flag) 1204, 1222 抓取死锁信息
    2. 跟踪标记 (Trace Flag) 3604, 3605 输出DBCC命令结果
    1. 跟踪标记 (Trace Flag) 1117, 1118 文件增长及空间分配方式
    0. 跟踪标记 (Trace Flag) 简介
    SpringBoot + Redis + Shiro 实现权限管理(转)
  • 原文地址:https://www.cnblogs.com/zhou2016/p/11732158.html
Copyright © 2011-2022 走看看