单例模式是最常见的设计模式:
1、忽略反射的影响,全局只有一个实例
2、有可能会出现延迟创建实例对象,要使用的时候才创建
3、这种设计模式能够避免线程安全问题
最常见的单例模式实现方法:
- 懒汉模式(单例对象 volatile + 双重检测机制 -> 禁止指令重排)
public class SingletonExample5 {
// 私有构造函数
private SingletonExample5() {
}
// 1、memory = allocate() 分配对象的内存空间
// 2、ctorInstance() 初始化对象
// 3、instance = memory 设置instance指向刚分配的内存
// 单例对象 volatile + 双重检测机制 -> 禁止指令重排
private volatile static SingletonExample5 instance = null;
// 静态的工厂方法
public static SingletonExample5 getInstance() {
if (instance == null) { // 双重检测机制 // B
synchronized (SingletonExample5.class) { // 同步锁
if (instance == null) {
instance = new SingletonExample5(); // A - 3
}
}
}
return instance;
}
用私有构造函数实现全局一个对象实例,用静态工厂方法实现延迟加载,用各种锁的机制,实现线程安全。
netty里面的单例模式有MqttEncoder和ReadTimeoutException,代码如下:
@ChannelHandler.Sharable
public final class MqttEncoder extends MessageToMessageEncoder<MqttMessage> {
public static final MqttEncoder INSTANCE = new MqttEncoder();
private MqttEncoder() { }
public final class ReadTimeoutException extends TimeoutException {
private static final long serialVersionUID = 169287984113283421L;
public static final ReadTimeoutException INSTANCE = new ReadTimeoutException();
private ReadTimeoutException() { }
}
他们都是使用私有构造函数实现全局单个对象实例,用public static final实现延迟加载和线程安全。