作用及其适用场景
表示全局唯一类
递增id生成器
处理资源冲突
并发调用同一个文件时的读写覆盖
常见写法
饿汉式
public class Logger{
private static final Logger instance = new Logger();
private Logger(){}
public static Logger getInstance() {
return instance;
}
}
懒汉式
public class Logger{
private static Logger instance;
private Logger(){}
public synchronized static Logger getInstance(
if (instance == null) {
instance = new Logger();
}
return instance
);
}
双重检测
public class Logger{
// private static volatile Logger instance; 有些文章里会给成员变量加上 volatile 关键字,防止指令重排(低版本java中,对象new操作与初始化不是一个原子操作,高版本进行了优化,所以不需要)
private static Logger instance;
private Logger(){}
public static Logger getInstance(
if (instance == null) {
synchronized(Logger.class) {
if (instance == null) {
instance = new Logger();
}
}
}
return instance
);
}
静态内部类
public class Logger{
private static Logger instance;
private Logger(){}
public static Logger getInstance(
return SingletonHolder.instance;
)
private static class SingletonHolder{
private static Logger instance = new Logger();
}
}
枚举
public enum Logger() {
INSTANCE();
}