Java|你真的懂单例模式吗?我能写8种,你呢?


Java|你真的懂单例模式吗?我能写8种,你呢?
文章图片
Java|你真的懂单例模式吗?我能写8种,你呢?
文章图片
Java|你真的懂单例模式吗?我能写8种,你呢?
文章图片
Java|你真的懂单例模式吗?我能写8种,你呢?
文章图片
Java|你真的懂单例模式吗?我能写8种,你呢?
文章图片
【Java|你真的懂单例模式吗?我能写8种,你呢?】
学java的小伙伴知道java有23种设计模式 , 设计模式有什么作用呢?可能我们最常用到的地方就是在面试中和面试官斗智斗勇 , 实际的开发中却很少会去使用 , 导致一个个都忘掉了 。 设计模式其实就是一些写代码的思想 , 如果想要提升自己 , 还是应该去深入理解并转化成自己的东西 。
今天就先讲一讲最常用的设计模式----单例模式 , 何为单例模式 , 类加载到内存后就实例化一个单例 , JVM保证线程安全 。 单例模式严格来讲有八种写法 , 今天我们就挨个看看都是怎么来写的 。
先来说说最常用的饿汉式 , 虽然并不是最完美的写法 , 但因为简单实用 , 所以在项目中是最常用的一种写法 , 这是利用了static 在类加载的时候就完成实例化了 。
第二种是用了静态语句块来实现的 , 本质上和第一种一样
第三种是我们通常说的懒汉式写法 , 虽然实现了按需初始化的目的 , 但却不一定是一个实例了 , 我这里写的例子为了让效果更明显 , 让他在判断完后睡了0.01秒 , 然后大家可以看到hashcode 是不同的 , 这说明不是同一个实例 。
第四种为了解决这个问题 , 直接在方法上加了synchronized , 这样虽然解决了问题 , 但效率下降
第五种方法 , 有人妄图使用减小同步代码块来提高效率 , 但是不可行
第六种方法 双重检查锁 , 在同步代码块里面再进行一次判断 , 这样就可以保证只有一个实例 , 但这种写法大家要用volatile去修饰 INSTANCE我之前有写过指令重排序的问题 , 大家可以去看一下 , 这里不再解释 。
第七种方法 静态内部类实现单例 , 加载外部类时不会加载内部类 , 这样可以实现懒加载 , 这是利用JVM的机制来实现的
第八种方法 枚举实现单例 , 这是Joshua Bloch 所著的Effiective Java一书中写到的方法 , 不仅可以解决线程同步问题 , 还可以防止反序列化 。 不能被反序列化是因为枚举没有构造方法 。 这应该是目前为止最完美的方法了 。
这么多种实现单例的方法 , 要如何使用其实还要根据实际情况 , 没必要硬扣字眼 。 大家要学习的是设计模式的思想 。 最后祝愿各位程序猿搬砖愉快 。