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();
        }
    }
    
    
    
    
    
     
     
     
  • 相关阅读:
    实习记录2
    实习记录1
    silverlight中 Storyboard(动画)的使用,实现球的上下循环移动,左右移动,及旋转功能
    实习记录7(正则表达式)
    SilverLight 控件ListBox中的SelectionChanged事件
    OpenStack collectd的从零安装服务端
    OpenStack 的防火墙规则流程
    OpenStack 的NAT解决办法
    OpenStack 界面开发中的排序问题
    OpenStack 界面开发中response.body的中文编码问题
  • 原文地址:https://www.cnblogs.com/zhou2016/p/11732158.html
Copyright © 2011-2022 走看看