单例模式的代码
-
饿汉式单例模式
public class SingleCaseExample { public static SingleCaseExample singleCaseExample = new SingleCaseExample(); private SingleCaseExample(){ } public static SingleCaseExample getInstance(){ return singleCaseExample; } }
-
懒汉式非线程安全的单例模式
public class SingleCaseExample { public static SingleCaseExample singleCaseExample; private SingleCaseExample(){ } public static SingleCaseExample getInstance(){ if(singleCaseExample == null){ singleCaseExample = new SingleCaseExample(); } return singleCaseExample; } }
-
懒汉式线程安全的单例模式
public class SingleCaseExample { public static volatile SingleCaseExample singleCaseExample; private SingleCaseExample(){ } public static SingleCaseExample getInstance(){ synchronized (SingleCaseExample.class){ if(singleCaseExample == null){ singleCaseExample = new SingleCaseExample(); } } return singleCaseExample; } }
-
懒汉式双重判空线程安全的单例模式
public class SingleCaseExample { public static volatile SingleCaseExample singleCaseExample; private SingleCaseExample(){ } public static SingleCaseExample getInstance(){ if(singleCaseExample == null){ synchronized (SingleCaseExample.class){ if(singleCaseExample == null){ singleCaseExample = new SingleCaseExample(); } } } return singleCaseExample; } }
-
静态内部类单例模式
public class SingleCaseExample { private static class StaticSingleCaseExample{ public static SingleCaseExample singleCaseExample = new SingleCaseExample(); } private SingleCaseExample(){ } public static SingleCaseExample getInstance(){ return StaticSingleCaseExample.singleCaseExample; } }
优缺点及使用场景
-
饿汉式单例模式
- 优势:项目创建就会创建实例,随时可以使用该实例
- 劣势:
- 参数情况
- 参数为空
- 如果有参数,参数内容是固定的值
- 如果有参数,参数是static修饰的属性
- 如果该实例未使用,但依然占用内存
- 参数情况
- 使用场景:项目创建后,很快会用到的时候,参数设置为static或固定值
-
懒汉式非线程安全的单例模式
- 优势:
- 当调用 getInstance() 方法后,才会创建实例,会节省内存
- 可以使用有参的构造函数创建实例
- 劣势:非线程安全的,多线程下可能会多次创建新的实例
- 使用场景:确认是单线程,并且需要参数的情况下,可以使用该方式
- 优势:
-
懒汉式线程安全的单例模式
- 优势:
- 当调用 getInstance() 方法后,才会创建实例,会节省内存
- 可以使用有参的构造函数创建实例
- 线程安全的,不会出现创建多个实例的情况
- 劣势:每次执行 getInstance() 方法都需要获取锁,耗时比较多
- 使用场景:不使用该方式
- 优势:
-
懒汉式双重判空线程安全的单例模式
- 优势:
- 当调用 getInstance() 方法后,才会创建实例,会节省内存
- 可以使用有参的构造函数创建实例
- 外层判空,可以减少获取锁的时间,减少耗时
- 内层判空,在线程安全的情况下,防止创建多个实例
- 劣势:还是需要获取锁
- 使用场景:多线程情况下,需要构造有参的实例,使用该方法
- 优势:
-
静态内部类单例模式
- 优势:
- 当调用 getInstance() 方法后,才会创建实例,会节省内存
- 根据 JVM 规则,会在调用静态内部类后创建实例,不需要锁的获取以及判空
- 线程安全的,不会出现创建多个实例的情况
- 劣势:
- 参数情况
- 参数为空
- 如果有参数,参数内容是固定的值
- 如果有参数,参数是static修饰的属性
- 参数情况
- 使用场景:构造无参实例的时候使用该方法或参数传入的值设置为static或为固定值
- 优势: