意图:保证一个类只有一个实例,并提供一个访问它的合局访问点。
示例一:使用内部静态类的方式保存INSTANCE
1 /**
2 * Created by wiikii on 14-5-12.
3 */
4 public class Singleton implements Serializable {
5
6 // 使用静态内部类保存INSTANCE
7 private static class SingletonHolder {
8 private static final Singleton _INSTANCE = new Singleton();
9 }
10
11 // 私有化构造函数 private or protected?
12 private Singleton() {}
13
14 // 对外接口,获取唯一实例句柄
15 public static Singleton Instance() {
16 return SingletonHolder._INSTANCE;
17 }
18
19 // readResolve方法应对单例对象被序列化时候
20 private Object readResolve() {
21 return Instance();
22 }
23 }
示例二:使用synchronized来保证线程同步。
1 /**
2 * Created by wiikii on 14-5-12.
3 */
4 public class Singleton implements Serializable {
5
6 private volatile static Singleton _INSTANCE;
7
8 private Singleton() {}
9
10 public static Singleton Instance() {
11 if (_INSTANCE == null) {
12 synchronized (Singleton.class) {
13 if (_INSTANCE == null) {
14 _INSTANCE = new Singleton();
15 }
16 }
17 }
18 return _INSTANCE;
19 }
20 }
注:
volatile 表示易失变量,主要用于多线程中。
为了提高效率,线程会将某变量(A)拷贝一份(B)到内存,线程对变量的访问实际访问的是(B),只是在某些特定的操作后,才会同步(A)与(B);因此有可能会存在(A)与(B)不一致的情况。使用volatile修饰的变量,就是告诉JVM不需要变量(A)的拷贝。
如果volatile关键字用于声明简单数据类型(如 int, boolean 等),那么对这些变量的操作将会是原子级别的;但是,如果当变量的值由自身的上一个值决定时,volatile将失效。
时间: 2024-10-14 05:32:01