单例模式
1、饿汉式单例模式的写法:线程安全
1 public class Singleton{
2 private static Singleton instance = new Singleton();
3 private Singleton(){}
4 public static Singleton newInstance(){
5 return instance;
6 }
7 }
2、懒汉式单例模式的写法:非线程安全
1 public class Singleton{
2 private static Singleton instance = null;
3 private Singleton(){}
4 public static synchronized Singleton newInstance(){
5 if(null == instance){
6 instance = new Singleton();
7 }
8 return instance;
9 }
10 }
3、双检锁单例模式的写法:线程安全
1 public class Singleton {
2 private static volatile Singleton instance = null;//volatile的⼀个语义是禁⽌指令重排序优化
3 private Singleton(){}
4 public static Singleton getInstance() {
5 if (instance == null) {
6 synchronized (Singleton.class) {
7 if (instance == null) {//2
8 instance = new Singleton();
9 }
10 }
11 }
12 return instance;
13 }
14 }
4、静态内部类方式:可以同时保证延迟加载和线程安全。
1 public class Singleton{
2 private static class SingletonHolder{
3 public static Singleton instance = new Singleton();
4 }
5 private Singleton(){}
6 public static Singleton newInstance(){
7 return SingletonHolder.instance;
8 }
9 }
5、枚举:使⽤枚举除了线程安全和防止反射调⽤构造器之外,还提供了自动序列化机制,防止反序列化的时候创建新的对象。
1 public enum Singleton{
2 instance;
3 public void whateverMethod(){}
4 }