为了账号安全,请及时绑定邮箱和手机立即绑定

java的单例模式的一个问题

java的单例模式的一个问题

慕尼黑8549860 2019-02-20 07:56:32
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; } } 请教一下这两种方法的区别是什么,哪个更好?
查看完整描述

6 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

关于单例模式,其实一共有5种方式:

  1. 懒汉模式,对应你的第一种代码,优点是:延迟加载,缺点是:每次获取实例都需要进行锁同步,浪费资源。

  2. 饿汉模式,对应你的第二种代码,优点是:线程安全,缺点是:一上来就加载,浪费资源。

  3. 双重校验锁的懒汉模式。

  4. 静态内部类的懒汉模式。

  5. Effective Java中推荐使用enum实现单例。

查看完整回答
反对 回复 2019-03-01
?
喵喔喔

TA贡献1735条经验 获得超5个赞

方法二更好,原因就是方法一使用了并发,消耗了性能。

查看完整回答
反对 回复 2019-03-01
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

就是懒汉模式和饿汉模式啊,简单来说就是否是懒加载。这种东西不能说好不好,要看实际场景的。

查看完整回答
反对 回复 2019-03-01
?
四季花海

TA贡献1811条经验 获得超5个赞

方法二只是为并发做了准备,也就是考虑到并发的获取单例的对象的情况,具体会不会并发访问是这个类的使用者决定的。
这2种各有各的优缺点。第一种方法,加载快,而获取单例对象较慢,因为使用了if判断,还要运行时去new对象.第二种,加载类较慢,获取快。因为静态成员是在类加载时初始化的.同时,你的第二个方法没有必要synchronized , 因为你只是单纯的返回对象的引用,不涉及到new的对象

查看完整回答
反对 回复 2019-03-01
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

这是单例模式的俩种设计的方法 都采用的同步防止并发出现线程的安全问题 但是第一种是懒汉的设计方法第二种是饿汉的设计方法 对于程序本身没有太大的区别 就是得到对象的时机有所不同而已

查看完整回答
反对 回复 2019-03-01
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

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

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

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

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

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

查看完整回答
反对 回复 2019-03-01
  • 6 回答
  • 0 关注
  • 519 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号