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枚举数据类型效率