• 单例DCL模式


    单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。

    一般写法

    public class DCLSingle {
        
        public static  DCLSingle  instance= null;
    
        private DCLSingle(){
            System.out.println("DCLSingle create");
        }
        
        public static DCLSingle getDCLSingle(){
            if (instance == null){
                instance = new DCLSingle();
            }
            
            return instance;
        }
    
    }

    上述写法在高并发环境下存在安全问题,比如通过200个线程同时获取DCLSingle单例对象,但会创建多个实例。

    public class DCLSingleTest {
        
        public static void main(String[] args){
            for(int i= 0 ;i<200 ;i++){
                Thread thread =new Thread(new Runnable(){
                    @Override
                    public void run() {
                        DCLSingle.getDCLSingle();
                    }
                    
                });
                thread.start();
            }
        }
        
    }

     测试结果如下:


    DCL单例模式可以很好的解决上述高并发环境下的安全性问题。

    public class DCLSingle {
        
        public static volatile DCLSingle  instance= null;
    
        private DCLSingle(){
            System.out.println("DCLSingle create");
        }
        
    
        public static DCLSingle getDCLSingle(){
            
            if (instance == null){
                synchronized(DCLSingle.class){
                    if(instance == null){
                        instance = new DCLSingle();
                    }
                }
            }
            
            return instance;
            
        }
        
    }

    其中添加修饰符volatile,为了防止instance在创建过程中编译器或处理器对指令重排序,导致有的线程获取的instance对象不为null,但还没有完成初始化。

  • 相关阅读:
    跨浏览器的事件对象(EventUtil)
    原型 Object.create
    DC大牛的function扩展
    事件代理 proxy
    错误处理程序
    JQuery 插件
    关于ClownFish的问题
    C#拾遗
    Jquery技巧
    防盗链
  • 原文地址:https://www.cnblogs.com/xiaoliangup/p/11017427.html
Copyright © 2020-2023  润新知