单例模式

不积跬步,无以至千里。不积小流,无以成江海。

饿汉模式

1
2
3
4
5
6
7
8
9
10
package test;
public class MyObject {
    // 立即加载方式==饿汉模式
    private static MyObject myObject = new MyObject();
    private MyObject() {
    }
    public static MyObject getInstance() {
        return myObject;
    }
}

懒汉模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package test;
public class MyObject {
    private volatile static MyObject myObject;
    private MyObject() {
    }
    public static MyObject getInstance() {
        try {
            if (myObject != null) {
            } else {
                // 模拟在创建对象之前做一些准备性的工作
                Thread.sleep(3000);
                synchronized (MyObject.class) {
                    if (myObject == null) {
                        myObject = new MyObject();
                    }
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return myObject;
    }
}

静态内置类模式

1
2
3
4
5
6
7
8
9
10
11
package test;
public class MyObject {
    private static class MyObjectHandler {
        private static MyObject myObject = new MyObject();
    }
    private MyObject() {
    }
    public static MyObject getInstance() {
        return MyObjectHandler.myObject;
    }
}

静态内置类可以达到线程安全问题,但如果遇到序列化对象时,使用默认的方式运行得到的结果还是多例的。

解决方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package test;
public class MyObject {
    private static class MyObjectHandler {
        private static MyObject myObject = new MyObject();
    }
    private MyObject() {
    }
    public static MyObject getInstance() {
        return MyObjectHandler.myObject;
    }
    protected Object readResolve() throws ObjectStreamException {
    System.out.println("调用了readResolve方法!");
    return MyObjectHandler.myObject;
    }
}

静态代码模式

1
2
3
4
5
6
7
8
9
10
11
12
package test;
public class MyObject {
    private static MyObject instance = null;
    private MyObject() {
    }
    static {
        instance = new MyObject();
    }
    public static MyObject getInstance() {
        return instance;
    }
}