zoukankan      html  css  js  c++  java
  • 单例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,但还没有完成初始化。

  • 相关阅读:
    我参与过的开源项目
    chineking / WeiboCrawler / wiki / Home — Bitbucket
    PIL应用之生成验证码图片
    hurl
    Hadoop笔记之安装及伪分布式模式配置
    httpbin(1): HTTP Client Testing Service
    动态规划求编辑距离 残阳似血的博客
    cppreference.com
    sscanf
    在python中定义二维数组
  • 原文地址:https://www.cnblogs.com/xiaoliangup/p/11017427.html
Copyright © 2011-2022 走看看