最近公司项目封版,有了很多的闲暇时间。
“无聊”之余,发现很久没有整理一下有道云笔记了。
虽然偶尔会往里面记录一些内容,但是长时间没回顾,也容易忘记。
趁着这段时间,刚好整理一下笔记,还可以放在博客上发布出来,何乐而不为?
那么接下来这段时间就逐步把笔记整理成博客吧。
首先,就从单例模式开始!
本文主要目的是举例几个单例模式的实现方式。
废话不多说,直接上代码
懒汉/恶汉记忆方法
- 懒汉:太懒,直到获取对象时getInstance()才创建对象new MySingleton()。
- 恶汉:太饿了,必须先创建对象new MySingleton(),才让别人获取getInstance()
1. 懒汉模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class MySingleton { private static MySingleton instance = null; private MySingleton(){} public static MySingleton getInstance() { if(instance == null){ //懒汉式,别人获取它时才创建对象 instance = new MySingleton(); } return instance; } }
|
2. 恶汉模式
1 2 3 4 5 6 7 8 9 10 11 12
| public class MySingleton { //饿汉,先创建对象 private static MySingleton instance = new MySingleton(); private MySingleton(){} public static MySingleton getInstance() { return instance; } }
|
3. 枚举方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public enum EnumFactory{ singletonFactory; private MySingleton instance; //枚举类的构造方法在类加载是被实例化 private EnumFactory(){ instance = new MySingleton(); } public MySingleton getInstance(){ return instance; } }
|
4. 内部类实现方式
Java机制规定,内部类SingletonHolder只有在getInstance()方法第一次调用的时候才会被加载(实现了延迟加载效果),而且其加载过程是线程安全的(实现线程安全)。内部类加载的时候实例化一次instance
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| public class Singleton { //构造器私有化 private Singleton(){ } /** * 获取对象实例的静态方法 * @return */ public static Singleton getInstance() { return SingletonHolder.instance; } //静态内部类,在第一次被引用时被加载,私有 private static class SingletonHolder { private static Singleton instance = new Singleton(); } public static void main(String args[]) { Singleton instance1 = Singleton.getInstance(); Singleton instance2 = Singleton.getInstance(); System.out.println(instance1 == instance2); } }
|
5.参考文章
高并发下线程安全的单例模式