JavaEE初阶--单例模式的写法

目录

一.引言

二.单例模式

三.实现方式

3.1饿汉模式

3.2懒汉模式 

四.线程安全问题 

五.总结


一.引言

  在计算机领域中存在许多设计模式,各本书上都没有对总共有几种有明确的定义,所以我们一般称设计模式有n种,而单例模式是其中一种,本篇文章将会为大家介绍以下单例模式的写法。

二.单例模式

  单例模式能保证某个类在程序中只存在唯⼀⼀份实例, ⽽不会创建出多个实例。

三.实现方式

3.1饿汉模式

  在类加载的同时,创建实例。

class Singleton{
    private static Singleton instance=new Singleton();

    public static Singleton getInstance(){
        return instance;
    }

    private Singleton(){

    }
}

3.2懒汉模式 

  类加载的时候不创建实例,第一次使用的时候才创建实例。

class SingletonLazy{
    private static SingletonLazy instance=null;

    public static SingletonLazy getInstance(){
        if(instance==null){
            instance=new SingletonLazy();
        }
        return instance;
    }

    private SingletonLazy(){

    }
}

四.线程安全问题 

由上面的代码,我们可以知道,在懒汉模式情况下,如果多个线程同时调用getInstance()方法,可能会创建出多个实例。这就导致了线程不安全。所以我们在这里需要给懒汉模式加上锁。

class SingletonLazy{
    private static  volatile SingletonLazy instance=null;

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

    private SingletonLazy(){

    }
}

  加锁/解锁操作是一件开销比较高的事情,而懒汉模式的线程不安全只是发生在首次创建实例的时候,因此后续使用的时候,不必再进行加锁了。

所以代码中的第一个if就是判断instance的实例是否已经创建出。

同时为了避免“内存可见性”导致读取的instance出现偏差,于是补充上volatile

五.总结

本篇文章简单地介绍了以下单例模式中懒汉模式以及饿汉模式的写法以及他们的区别以及他们的线程不安全的原因和解决方法。欢迎各位在评论区进行讨论,感谢观看!

  • 19
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值