1:饿汉模式
public class MyObject {
// 立即加载方式 == 饿汉模式
private static MyObject myObject= new MyObject();
private MyObject(){}
public static MyObject getInstance(){
return myObject;
}
}
2:懒汉模式
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)
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:序列化与反序列化的单例模式实现
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:使用静态代码块
public class MyObject {
private static MyObject myObject;
static {
myObject = new MyObject();
}
private MyObject() {
}
synchronized public static MyObject getInstance() {
return myObject;
}
}
6:使用enum枚举数据类型