实现单例模式的几种方式

1:饿汉模式java

public class MyObject {
  // 当即加载方式 == 饿汉模式
  private static MyObject myObject= new MyObject();
  private MyObject(){}
  public static MyObject getInstance(){
    return myObject;
  }
}

2:懒汉模式code

public class MyObject {
  private static MyObject myObject;
  private MyObject(){}
  synchronized public static MyObject getInstance(){
    if (myObject == null) {
      myObject = new MyObject();
    }
    return myObject;
  }
}

注意:加入同步synchronized关键字获得相同实例的对象,但此种方式的运行效率很是低。对象

解决方法:使用DCL(Double-Check Locking)get

public class MyObject {
  private static MyObject myObject;
  private MyObject(){}
  public static MyObject getInstance(){
    if (myObject == null) {
      synchronized (MyObject.class) {
        if (myObject == null) {
          myObject = new MyObject();
        }
      }
    }
    return myObject;
  }
}

3:静态内置类同步

public class MyObject {
    private static class MyObjectHandler{
        private static MyObject myObject = new MyObject();
    }
    private MyObject() {
    }
    synchronized public static MyObject getInstance() {
        
        return MyObjectHandler.myObject;
    }
}

4:序列化与反序列化的单例模式实现io

public class MyObjectSerializable implements Serializable {
    private static final long serialVersionUID = 888L;
     private static class MyObjectHandler{
         private static final MyObjectSerializable myObject = new MyObjectSerializable();
     }
     private MyObjectSerializable() {

     }
     protected Object readResolve() throws ObjectStreamException {
         return MyObjectHandler.myObject;
     }

}

5:使用静态代码块class

public class MyObject {
    private static MyObject myObject;
    static {
        myObject = new MyObject();
    }
    private MyObject() {
    }
    synchronized public static MyObject getInstance() {

        return myObject;
    }
}

6:使用enum枚举数据类型效率

相关文章
相关标签/搜索