您好,匿名用户

java的单例模式的一个问题

0 投票

java单例模式下面两种方法有什么区别?

方法一:

public class SingleTon {

private static SingleTon singleTon;

private SingleTon(){
}

public synchronized  static SingleTon getSingleTon(){
    if(singleTon == null){
        singleTon = new SingleTon();
    }
    return singleTon;
}

}

方法二:

public class SingleTon {


private static SingleTon singleTon = new SingleTon();

private SingleTon(){
}

public synchronized static SingleTon getSingleTon(){
    return singleTon;
}

}

请教一下这两种方法的区别是什么,哪个更好?

用户头像 提问 2017年 6月16日 @ Kog'Maw 中士 (1,097 威望)
分享到:

1个回答

0 投票

两者的区别在于,方法一是懒加载,如果此方法不被调用,就不会生成对象,而后者在加载类的时候就会产生一个实例,无论使用与否。
最典型的懒加载写法应该是这样的

public static XXX getInstance(){
        if(xxx == null){
            synchronized(XXX.class){
                if(xxx == null){
                    xxx = new XXX();
                }
            }
        }
        return xxx;
    }

这样比较节省时间,也不会创建新的对象。
此外,在并发情况如果非常高的情况下,可用volatile修饰instance.

------------------------刚没仔细看你的代码,再补充点----------

我发现你给getInstance方法上了同步锁,这个是完全没必要的,只有在第一次创建时需要同步,之后的同步完全是浪费时间。

用户头像 回复 2017年 6月16日 @ Jax 中士 (1,059 威望)
提一个问题:

相关问题

0 投票
1 回复 37 阅读
0 投票
1 回复 34 阅读
用户头像 提问 2017年 3月22日 @ Alistar 中士 (1,086 威望)
0 投票
1 回复 45 阅读
0 投票
1 回复 112 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...