打开网易新闻 查看精彩图片

学java的小伙伴知道java有23种设计模式,设计模式有什么作用呢?可能我们最常用到的地方就是在面试中和面试官斗智斗勇,实际的开发中却很少会去使用,导致一个个都忘掉了。设计模式其实就是一些写代码的思想,如果想要提升自己,还是应该去深入理解并转化成自己的东西。

打开网易新闻 查看精彩图片

今天就先讲一讲最常用的设计模式----单例模式,何为单例模式,类加载到内存后就实例化一个单例,JVM保证线程安全。单例模式严格来讲有八种写法,今天我们就挨个看看都是怎么来写的。

打开网易新闻 查看精彩图片

先来说说最常用的饿汉式,虽然并不是最完美的写法,但因为简单实用,所以在项目中是最常用的一种写法,这是利用了static 在类加载的时候就完成实例化了。

打开网易新闻 查看精彩图片

第二种是用了静态语句块来实现的,本质上和第一种一样

打开网易新闻 查看精彩图片

第三种是我们通常说的懒汉式写法,虽然实现了按需初始化的目的,但却不一定是一个实例了,我这里写的例子为了让效果更明显,让他在判断完后睡了0.01秒,然后大家可以看到hashcode 是不同的,这说明不是同一个实例。

打开网易新闻 查看精彩图片

第四种为了解决这个问题,直接在方法上加了synchronized,这样虽然解决了问题,但效率下降

打开网易新闻 查看精彩图片

第五种方法,有人妄图使用减小同步代码块来提高效率,但是不可行

打开网易新闻 查看精彩图片

第六种方法 双重检查锁,在同步代码块里面再进行一次判断,这样就可以保证只有一个实例,但这种写法大家要用volatile去修饰 INSTANCE,我之前有写过指令重排序的问题,大家可以去看一下,这里不再解释。

打开网易新闻 查看精彩图片

第七种方法 静态内部类实现单例,加载外部类时不会加载内部类,这样可以实现懒加载,这是利用JVM的机制来实现的

打开网易新闻 查看精彩图片

第八种方法 枚举实现单例,这是Joshua Bloch 所著的Effiective Java一书中写到的方法,不仅可以解决线程同步问题,还可以防止反序列化。不能被反序列化是因为枚举没有构造方法。这应该是目前为止最完美的方法了。

这么多种实现单例的方法,要如何使用其实还要根据实际情况,没必要硬扣字眼。大家要学习的是设计模式的思想。最后祝愿各位程序猿搬砖愉快。