单例模式
单例模式,就是Java进程中只存在一个类的实例。
1. 懒汉式(首次使用时创建,之后判断单例实例存不存在)
public class LazySingleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
2. 饿汉式(在类初始化的时候就会创建,线程安全)
private static final Singleton instance = new Singleton();
3. 双检锁 使用volatile,防止指令重排;加锁;
public class VolatileTest {
public static volatile Singleton instance; // 确保线程可见性,防止指令重排,但是不能保证原子性
public static Singleton getInstance() {
if (instance == null) {
synchronized (VolatileTest.class) { // 防止线程在等待锁的时候已经创建了实例
if (instance == null) {
instance = new Singleton();
// 1. 为 instance 分配内存空间 2. 初始化 instance 3. 将 instance 指向分配的内存地址
// 如果不能防止指令重排 1. 为 instance 分配内存空间 3. 将 instance 指向分配的内存地址 2. 初始化 instance 多线程情况下会出现线程不安全
}
}
}
return instance;
}
}
4. 静态内部类
- 内部类在使用时才会创建实例
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){
}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
5. 枚举类
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
本文来自博客园,作者:帅气的涛啊,转载请注明原文链接:https://www.cnblogs.com/handsometaoa/p/17022982.html

浙公网安备 33010602011771号