zoukankan      html  css  js  c++  java
  • 单例模式-双重检查加锁

    (参考:http://www.cnblogs.com/java-my-life/archive/2012/03/31/2425631.html

    双重检查加锁:
        (1)既实现线程安全,又能够使性能不受很大的影响。那么什么是“双重检查加锁”机制呢?
       
       (2)所谓“双重检查加锁”机制,指的是:并不是每次进入getInstance方法都需要同步,而是先不同步,进入方法后,先检查实例是否存在,如果不存在才进行下面的同步块,这是第一重检查,进入同步块过后,再次检查实例是否存在,如果不存在,就在同步的情况下创建一个实例,这是第二重检查。这样一来,就只需要同步一次了,从而减少了多次在同步情况下进行判断所浪费的时间。    (3)“双重检查加锁”机制的实现会使用关键字volatile,它的意思是:被volatile修饰的变量的值,将不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存,从而确保多个线程能正确的处理该变量。
       (4)由于volatile关键字可能会屏蔽掉虚拟机中一些必要的代码优化,所以运行效率并不是很高。因此一般建议,没有特别的需要,不要使用。也就是说,虽然可以使用“双重检查加锁”机制来实现线程安全的单例,但并不建议大量采用,可以根据情况来选用。
    /**
     * Project Name:DesignPatterns
     * File Name:Single.java
     * Package Name:com.louis.singlePattern
     * Date:2017年9月26日下午9:24:31
     * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
     *
    */
    
    package com.louis.singlePattern;
    /**
     * ClassName:Single 
     * Function: TODO ADD FUNCTION. 
     * Reason:     TODO ADD REASON. 
     * Date:     2017年9月26日 下午9:24:31 
     * @author   michael
     * @version  
     * @since    JDK 1.7
     * @see      
     */
    public class Single {
        public volatile static  Single instanceSingle = null;
        
        private Single(){}
        
        public static Single getInstance(){
            //首先检查实例存不存在
            if(instanceSingle == null){
                //同步块,线程安全的创建实例
                synchronized (Single.class) {
                    //再次检查实例是否真的存在,如果不存在则真正创建实例
                    if(instanceSingle == null){
                        instanceSingle = new Single();
                    }
                }
            }
            return instanceSingle ;
        }
        
    }
  • 相关阅读:
    Making your first driver
    注册表与盘符(转victor888文章 )
    电脑Win7如何取得文件管理所有权(提供各种GHOST版本的Windows)
    可拖动的DIV
    IE Javascript 进阶调试
    优化性能
    命令模式
    MVC 4 结合jquery.uploadify 上传实例
    IIS处理并发请求时出现的问题及解决
    Spring3.2 + Hibernate4.2
  • 原文地址:https://www.cnblogs.com/Michael2397/p/7599073.html
Copyright © 2011-2022 走看看