设计模式-单例模式

时间:2021-7-4 作者:qvyue

一、饿汉式

类加载到内存后,就实例化一个单例,JVM保证线程安全,但是不管用到与否,类装载时就完成实例化。

二、懒汉式

按需初始化,但是线程不安全。
如下所示:

 public static Test getInstance() {
        if (INSTANCE == null) {
            //多线程下 线程不安全测试
            try {
                Thread.sleep(0.5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            INSTANCE = new Test() ;
        }
        return INSTANCE;
    }

//调用
 for(int i=0; i{
                System.out.println(Test.getInstance().hashCode());
            }).start();
  }

运行结果

2116194883
38860249

运行上面代码会发现 打印出的hashCode 不一致(线程执行很快,中间),懒汉式导致了线程不安全。
加锁可以解决,但是牺牲了一定的性能。
如果想通过减小同步代码块的方式提高效率,则需要双重判断,切需要加上volatile(JIT优化的时候)。

比较好的懒汉模式(Java创始人之一提出的):
枚举单例:仅可以解决线程同步,还可以防止反序列化(没有构造方法,没法反序列化)。

public enum Test{
    INSTANCE;
    public void m() {}
}

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。