MyException - 我的异常网
当前位置:我的异常网» Java相关 » 有关singleton模式中java double check失效有关问题

有关singleton模式中java double check失效有关问题

www.MyException.Cn  网友分享于:2013-09-29  浏览:17次
有关singleton模式中java double check失效问题
虽然从Java5之后可以通过将字段声明为volatile来避免了java中double check失效问题,但还是有点不大明白,主要由以下两点:
Java code

public class lazySingleton {
    private static volatile lazySingleton m_instance=null;
    private lazySingleton() {
        // TODO Auto-generated constructor stub
        System.out.println("构造函数");
    }
    public static lazySingleton getInstance(){
        if(m_instance==null){
            synchronized (lazySingleton.class) {
                if(m_instance==null){
                    m_instance=new lazySingleton(); //疑惑一
                }
            }
        }
        return m_instance;
    }
    public void print(){
        System.out.println("print");
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        lazySingleton.getInstance().print();
    }
}


1.能简要描述下到底是什么原因导致double check失效的吗?虽然很多地方看到是由于Java 编译器中LazySingleton类的初始化与instance变量的赋值顺序不可预料。以上代码“疑惑一”处,如果构造函数没有执行完毕,m_instance不是仍然为null吗?再说,如果构造函数没有执行完毕,会解锁吗?
2.外部加锁代码,每次都synchronized 
Java code

synchronized public static lazySingleton getInstance(){
        if(m_instance==null){
            m_instance=new lazySingleton();
        }
        return m_instance;
    }


为什么此处就不会出现上述的问题呢,个人感觉同样会出现一个线程的构造函数没有执行完毕,但已经对m_instance赋值,导致别的线程引用未知指向的m_instance吗?

------解决方案--------------------
第一,你没有理解Singleton模式,要不然你不会问“如果构造函数没有执行完毕,m_instance不是仍然为null吗?”
第二,你也没有理解synchronized 放在方法前面的含义,不然你就会知道第二种方法是无论如何也不会出现问题的。
第三,我觉得第一段代码是没有问题的。


探讨
虽然从Java5之后可以通过将字段声明为volatile来避免了java中double check失效问题,但还是有点不大明白,主要由以下两点:

Java code


public class lazySingleton {
private static volatile lazySingleton m_instance=null;
private lazySin……

------解决方案--------------------
双检锁失效的主要论点是:
m_instance=new lazySingleton();
这句话会被优化时的指令重排,以至于先赋值,再执行对象初始化:
m_instance = 对象内存位置;
对象.构造函数();
以至于某线程可能得到一个未初始化完毕的对象,所以关键问题已经不是在synchronized身上,而是 if

Java code
    public static lazySingleton getInstance(){
        if(m_instance==null){ // B线程检测到m_instance不为空
            synchronized (lazySingleton.class) {
                if(m_instance==null){
                    m_instance=new lazySingleton(); // A线程被指令重排了,刚好先赋值了;但还没执行完构造函数。
                }
            }
        }
        return m_instance; // 后面B线程执行时将引发:对象尚未初始化错误。
    }

------解决方案--------------------
http://icyfenix.iteye.com/blog/575052
------解决方案--------------------
不是你说的那个意思啊。

没加volatile的问题最多也只是B线程看不到A线程的赋值而已,那么无非是if条件成立,进入synchronized进行等待。

恰恰是加了volatile,才让B线程能更好的立即看到A线程的赋值;从而B线程可以调用一个无效对象。
------解决方案--------------------
诚惶诚恐


volatile的作用:http://www.ticmy.com/?p=118

如果楼主只是从源码角度去看多线程代码,很多并发问题是看不出来的,如果以前没有接触过,可先查阅 java内存模型 (Java Memory Model) 相关资料


探讨

ticmy来了,这哥们是专家,楼主揪住他K吧,哈哈哈

话说我在JDK1.4上,完全测不出双检锁效果。

文章评论

聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
程序员应该关注的一些事儿
程序员应该关注的一些事儿
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
那些争议最大的编程观点
那些争议最大的编程观点
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
老程序员的下场
老程序员的下场
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
程序员必看的十大电影
程序员必看的十大电影
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员和编码员之间的区别
程序员和编码员之间的区别
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
旅行,写作,编程
旅行,写作,编程
 程序员的样子
程序员的样子
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
如何成为一名黑客
如何成为一名黑客
Java程序员必看电影
Java程序员必看电影
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
每天工作4小时的程序员
每天工作4小时的程序员
漫画:程序员的工作
漫画:程序员的工作
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
我是如何打败拖延症的
我是如何打败拖延症的
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
总结2014中国互联网十大段子
总结2014中国互联网十大段子
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
我的丈夫是个程序员
我的丈夫是个程序员
编程语言是女人
编程语言是女人
代码女神横空出世
代码女神横空出世
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
鲜为人知的编程真相
鲜为人知的编程真相
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
为什么程序员都是夜猫子
为什么程序员都是夜猫子
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有