您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> Java >> 关于线程安全单例模式的探究,大家伙来分析下哇

关于线程安全单例模式的探究,大家伙来分析下哇

来源:网络整理     时间:2016/6/20 2:18:38     关键词:

关于网友提出的“ 关于线程安全单例模式的探究,大家伙来分析下哇”问题疑问,本网通过在网上对“ 关于线程安全单例模式的探究,大家伙来分析下哇”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 关于线程安全单例模式的探究,大家伙来分析下哇
描述:

线程安全单例模式singleton静态内部类单例模式

所谓的线程安全的单例模式,是指在创建这个对象时的线程安全,并不是使用时的安全,那么这种情况呢,
当第一次加载单例模式后,该单例对象就已经存在,接下来就来了两个线程,A和B,在A获得单例后,对该单例进行了一些修改准备做某事,
但是A还没开始做事的时候,CPU把运行片段分配给了B,此时B也获得该单例,因为单例模式是static,所以B获得的是A修改后的单例对象,
然而,B也需要对该单例对象进行一些修改,在B修改完后CPU又把运行片段给了A,此时A手上的单例对象已不是他修改的单例对象而是B修改后的单例对象,
那么,这个就应该不叫线程安全吧?
我理解的对么?我把静态内部类单例模式的代码贴出来,据说他就是线程安全的懒汉式单例模式

public class Singleton {  
private Singleton(){ }  
    
    public static Singleton getInstance()  
    {  
        return Nested.instance;       
    }  
      
    //在第一次被引用时被加载  
    static class Nested  
    {  
        private static Singleton instance = new Singleton();  
    }


解决方案1:

线程安全只是针对变量来说的,如果线程在调用方法的时候用到的变量都是局部变量, 那就是线程安全的.
你怕初始化的时候有可能出现多个实例的情况
可以这样写


public class Singleton {  
    private Singleton(){ }  
    private static final Integer Lock = new Integer(1);
    private static Singleton instance = null;
    public static Singleton getInstance()  {  
           if(instance == null){
               synchronized (Lock) {
                    if(instance == null){
                          instance = new  Singleton();
                    }
               }
           }
          return instance;
    } 


以上介绍了“ 关于线程安全单例模式的探究,大家伙来分析下哇”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/1789432.html

相关图片

相关文章