饿汉式(不存在线程安全问题)
1. 直接实例化
/**
* 饿汉式 直接创建对象 不存在线程安全问题
*/
class Singlton1{
public static final Singlton1 INSTANCE=new Singlton1();
private Singlton1() {
}
}
2.枚举单例(最为简单)
/**
* 枚举单例 最为简单
*/
enum Singlton2{
INSTANCE;
}
3.静态代码块实例化
适合于复杂的情况
/**
* 静态代码块 在类加载时完成初始化
*/
class Singlton3{
public static final Singlton3 INSTANCE;
static {
INSTANCE=new Singlton3();
}
private Singlton3() {
}
}
懒汉式(延迟创建对象)
4.适用于单线程
/**
* 懒汉式
* 延迟创建对象
* <p>
* 构造器私有化
* 用静态变量保存该实例
* 用静态方法创建该实例
*/
class Singlton4 {
public static Singlton4 instance;
public static Singlton4 getInstance() {
if (instance == null) {
//如果多线程下 可能同时判断为空 造成同时创建多个对象
instance = new Singlton4();
}
return instance;
}
private Singlton4() {
}
}
5.单例双重校验(多线程)
/**
* 双重校验
*/
class Singlton5 {
//这里用volatile 是为了防止指令重排
public volatile static Singlton5 instance;
public static Singlton5 getInstance() {
//这一步判断是为了提高效率 不用每次都去加锁判断对象为不为空
if (instance == null) {
synchronized (Singlton5.class) {
if (instance == null) {
//如果不加锁 可能有两个线程在instance为空时进入这一步
instance = new Singlton5();
}
}
}
return instance;
}
private Singlton5() {
}
}
6.静态内部类形式(多线程)
/**
* 静态内部类只在内部类被加载和初始化时 才会创建对象 也就保证了线程安全
*/
class Singlton6 {
private Singlton6() {
}
private static class Inner {
private static final Singlton6 INSTANCE = new Singlton6();
}
public static Singlton6 getInstance() {
return Inner.INSTANCE;
}
}
冀以尘雾之微补益山海,荧烛末光增辉日月——陈思王(曹植)