利用锁的原理,来比较一下四种单例模式。
第一种:线程不安全,不正确
1 class Singleton { 2 3 private static Singleton instance; 4 5 private Singleton() { 6 7 } 8 9 public static Singleton getInstance() { 10 11 if (instance == null) { 12 13 instance = new Singleton(); 14 } 15 16 return instance; 17 } 18 }
第二种:线程安全,但是高并发性能不是很高
1 class Singleton { 2 3 private static Singleton instance; 4 5 private Singleton() { 6 7 } 8 9 public static synchronized Singleton getInstance() { 10 11 if (instance == null) { 12 13 instance = new Singleton(); 14 } 15 16 return instance; 17 } 18 }
第三种:线程安全,性能又高,这种写法最常见。
1 class Singleton { 2 3 private static Singleton instance; 4 private static byte[] lock = new byte[0]; 5 6 private Singleton() { 7 8 } 9 10 public static Singleton getInstance() { 11 12 if (instance == null) { 13 14 synchronized (lock) { 15 instance = new Singleton(); 16 } 17 } 18 19 return instance; 20 } 21 }
第四种:线程安全,性能又高,这种写法也最为常见。
1 class Singleton { 2 3 private static Singleton instance; 4 private static ReentrantLock lock = new ReentrantLock(); 5 6 private Singleton() { 7 8 } 9 10 public static Singleton getInstance() { 11 12 if (instance == null) { 13 14 lock.lock(); 15 if (instance == null) { 16 instance = new Singleton(); 17 } 18 lock.unlock(); 19 } 20 21 return instance; 22 } 23 }