这两个单例哪个好?

码农与厨子 发布于 2013/08/15 17:22
阅读 450
收藏 0
package com.zl.util;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;

/**
 * User: c3t
 * Date: 13-8-15
 * Time: 下午3:35
 */
public class XMLUtil {

    private static   Document user;
    private XMLUtil() {

    }

    private static class Help{
        private static   Document userDocuemtn;

        {

            SAXReader saxReader = new SAXReader();
            try {
                  userDocuemtn = saxReader.read(XMLUtil.class.getClassLoader().getResourceAsStream("xml/user.xml"));

            } catch (org.dom4j.DocumentException e1) {
                e1.printStackTrace();
            }
        }

    }

    public static final Document getInstance() {
        return Help.userDocuemtn;
    }




  public static Document getUserDocuemtn() {
        if (user != null) {
            return user;
        }
        SAXReader saxReader = new SAXReader();
        try {
            user = saxReader.read(XMLUtil.class.getClassLoader().getResourceAsStream("xml/user.xml"));

        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return user;
    }

}
加载中
0
_________0
_________0
第一个吧,第二个初始化那块 貌似多线程下会有问题的
0
码农与厨子
码农与厨子

引用来自“浪子__”的答案

第一个吧,第二个初始化那块 貌似多线程下会有问题的
的确
0
C
CrS

第一个

0
C
CrS

第一个方法,使用内部块是Java的通常初始化单例的方法,内部块调用的时间是该类第一次被调用的之前,也就是你代码中的任何地方第一次出现XMLUtil::Help之前。

第二个方法是C++的做法,不过更为线程安全的方法是:判断->(如果单例未初始化)加锁->再次判断->(如果未初始化)初始化

0
银古
银古

第一个叫饿汉模式,最基本的单例,启动的第一时间就加载这个单例
第二个叫懒汉模式,更节省内存,第一次调用时才会加载这个单例。不过这里会出现线程安全问题,给第二个代码加个synchronized锁一下就好了

0
_散财童子_
_散财童子_
单例最好不要用延迟初始化模式,懒加载有并发问题
0
苗哥
苗哥

关于单例模式,其实可以看看我转的这篇文章:http://my.oschina.net/bairrfhoinn/blog/145562

最后壹种方法是最理想的,具体用哪种取决于你的需求。

0
xue777hua
xue777hua
其实。。。我想说的是,因为这是个Reader,而user.xml估计是个配置文件。。。在这个特定的例子中,哪怕第二个没加锁,多线程环境下最多产生两个reader但是不会有同步问题。。。
返回顶部
顶部