保证一个类仅有一个实例,并提供一个访问它的全局访问点。

饿汉式单例模式

  1. //饿汉式单例模式
  2. public class Singleton(){
  3. private Singleton(){}
  4. private static Singleton singleton = new Singleton();
  5. public static Singleton getInstance(){
  6. return singleton;
  7. }
  8. }

懒汉式单例模式(线程不安全)

  1. public class Singleton(){
  2. private Singleton(){}
  3. private static Singleton singleton;
  4. public static Singleton getInstance(){
  5. if(singleton == null){
  6. singleton = new Singleton();
  7. }
  8. return singleton;
  9. }
  10. }

懒汉式单例模式(线程安全)

  1. public class Singleton(){
  2. private Singleton(){}
  3. private static Singleton singleton;
  4. public static synchronized Singleton getInstance(){
  5. if(singleton == null){
  6. singleton = new Singleton();
  7. }
  8. return singleton;
  9. }
  10. }
  11. //在方法上加锁虽然保证了线程安全,但每次调用该方法都必须同步,有时会造成没有必要的消耗

双重检查模式(DCL)

  1. public class Singleton(){
  2. private volatile static Singleton singleton;
  3. private Singleton(){}
  4. public static Singleton getInstance(){
  5. if(singleton == null){
  6. synchronized(Singleton.class){
  7. singleton = new Singleton();
  8. }
  9. return singleton;
  10. }
  11. }
  12. }
  13. //只有单例为空的情况下才加锁同步