单例模式特点
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其他对象提供这一实例。
饿汉式(静态常量)
-
构造器私有化
-
类内部创建
-
向外部暴露一个静态的公共方法
-
优点;简单,避免了线程同步问题
-
缺点,如果没使用,就造成了内存浪费;2没有达到满加载效果
-
代码实现:
饿汉式(静态代码块) -
只是实现方式不同,优缺点和上述一致
-
代码实现:
-
懒汉式(线程不安全) -
优点:懒加载
-
缺点:只能在单线程下,多线程会造成多个实例,实际开发中,不能使用
-
代码实现
懒汉式(线程安全,同步方法)-
优点:线程安全
-
缺点:效率太低了,只是第一次的时候进行同步就行了,后面的可以直接返回,这种方式同步效率太低,实际开发中,不能使用
-
代码实现
懒汉式(线程不安全,同步代码块)- 起不到线程同步作用,进入了if判断中就会出现多个实例
- 开发中不能使用
- 代码实现
双重检查-
推荐使用
-
优点,懒加载问题解决,线程安全,效率较高
-
代码实现
静态内部类 -
volatile和synchronized可以删除
-
线程安全,也是懒加载,效率高,推荐使用
-
采用类状态机制保证初始化实例只有一个线程
-
类的静态属性,只有第一次加载类的时候进行初始化,这里JVM帮助咱们完成了线程安全,类初始化时其他类无法进入
-
代码实现
枚举
-
-
由于枚举的底层方法都是静态的常量的
-
线程安全,也是懒加载,效率高,还能防止反序列化,推荐使用
-
代码实现
-
注意事项
- 对于一些频繁创建销毁的对象,使用单例模式可以提高系统性能
- 实例化一个单例类的时候,必须使用相应获取对象的方法,而不是new