java单例设计模式 习题_java设计模式中的单例模式,收藏起来慢慢看!

在java中,单例模式算是比较基础和简单的,今天就来简单聊聊什么是单例模式。比如说,一个应用程序中,某个类的实例对象只有一个,而我们没有办法new,因为构造器已经被private声明了,通过getInstance()的方法可以获取它们的实例。getInstance()的返回值是一个对象的引用,并不是一个新的实例,这点要注意理解,不要错误的认为是多个对象。

48cbeddad3f31c3c6a1ad9786a94db60.png单例模式

代码例子:

public class Singleton {private static Singleton singleton;private Singleton() {}public static Singleton getInstance() {if (singleton == null) { singleton = new Singleton(); } return singleton;}}

这是最基本的写法,非常简单但是线程不安全。其实还有另外几种写法:

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

faa3fb317bbaddf6dfe005ea741d004e.png

这也是基本的写法,但是这样写的线程是安全的。在这些基础的写法之上,伟大的程序员们又开发出来几种别的新花样,如:

饿汉式写法:

public class Singleton {

private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } }

静态内部类

public class Singleton {

private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }

23325cb1a6ef5e36a23d166b02361b67.png静态内部类

枚举

public enum Singleton {

INSTANCE; public void whateverMethod() { } }

这种方式能避免多线程同步问题,还能防止反序列化重新创建新的对象。

双重校验锁

public class Singleton {

private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }

e0c39fab571d92af5edf1961a86b0848.pngIT圈不乱

对于初学者来说,首先要弄懂最基本的写法是什么意思,然后再去尝试更多的写法,就一通百通了。有想法的朋友们,欢迎在评论区留言讨论,也可以关注我的百家号:IT圈不乱!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值