Java|你真的懂单例模式吗?我能写8种,你呢?
文章图片
文章图片
文章图片
文章图片
文章图片
【Java|你真的懂单例模式吗?我能写8种,你呢?】
学java的小伙伴知道java有23种设计模式 , 设计模式有什么作用呢?可能我们最常用到的地方就是在面试中和面试官斗智斗勇 , 实际的开发中却很少会去使用 , 导致一个个都忘掉了 。 设计模式其实就是一些写代码的思想 , 如果想要提升自己 , 还是应该去深入理解并转化成自己的东西 。
今天就先讲一讲最常用的设计模式----单例模式 , 何为单例模式 , 类加载到内存后就实例化一个单例 , JVM保证线程安全 。 单例模式严格来讲有八种写法 , 今天我们就挨个看看都是怎么来写的 。
先来说说最常用的饿汉式 , 虽然并不是最完美的写法 , 但因为简单实用 , 所以在项目中是最常用的一种写法 , 这是利用了static 在类加载的时候就完成实例化了 。
第二种是用了静态语句块来实现的 , 本质上和第一种一样
第三种是我们通常说的懒汉式写法 , 虽然实现了按需初始化的目的 , 但却不一定是一个实例了 , 我这里写的例子为了让效果更明显 , 让他在判断完后睡了0.01秒 , 然后大家可以看到hashcode 是不同的 , 这说明不是同一个实例 。
第四种为了解决这个问题 , 直接在方法上加了synchronized , 这样虽然解决了问题 , 但效率下降
第五种方法 , 有人妄图使用减小同步代码块来提高效率 , 但是不可行
第六种方法 双重检查锁 , 在同步代码块里面再进行一次判断 , 这样就可以保证只有一个实例 , 但这种写法大家要用volatile去修饰 INSTANCE我之前有写过指令重排序的问题 , 大家可以去看一下 , 这里不再解释 。
第七种方法 静态内部类实现单例 , 加载外部类时不会加载内部类 , 这样可以实现懒加载 , 这是利用JVM的机制来实现的
第八种方法 枚举实现单例 , 这是Joshua Bloch 所著的Effiective Java一书中写到的方法 , 不仅可以解决线程同步问题 , 还可以防止反序列化 。 不能被反序列化是因为枚举没有构造方法 。 这应该是目前为止最完美的方法了 。
这么多种实现单例的方法 , 要如何使用其实还要根据实际情况 , 没必要硬扣字眼 。 大家要学习的是设计模式的思想 。 最后祝愿各位程序猿搬砖愉快 。
推荐阅读
- 计算机专业大一下学期,该选择学习Java还是Python
- 比起007,996真的是福报!互联网大厂为什么加班都这么狠?
- 未来想进入AI领域,该学习Python还是Java大数据开发
- 只需799元就可以把旧iPad换成新款iPad?是真的!但这羊毛可没那么容易薅
- 学习大数据是否需要学习JavaEE
- 华为手机备忘录真的太赞了,居然集成了7大功能,个个都非常实用
- 爱立信突然宣布!瑞典“坏消息”从天而降?华为5G真的没辙了?
- 真的开始普及了,全天候全地形按摩放松神器
- 从事Java开发时发现基础差,是否应该选择辞职自学一段时间
- “低价误国,高价兴邦”,小米真的做错了吗?