您现在的位置是:主页 > news > 织梦网站安装出现404 not found/手机黄页怎么找
织梦网站安装出现404 not found/手机黄页怎么找
admin2025/5/23 4:28:45【news】
简介织梦网站安装出现404 not found,手机黄页怎么找,中国安能建设集团有限公司网站,镭拓网站建设目录单例模式1.饿汉模式2.懒汉模式3.双重检查注意:重排序问题:解决:Volatile关键字4.静态内部类5.枚举单例模式 单例模式主要有5种模式: 饿汉模式:实例在初始化就已经创建好对象。懒汉模式:在使用实例时进…
织梦网站安装出现404 not found,手机黄页怎么找,中国安能建设集团有限公司网站,镭拓网站建设目录单例模式1.饿汉模式2.懒汉模式3.双重检查注意:重排序问题:解决:Volatile关键字4.静态内部类5.枚举单例模式
单例模式主要有5种模式:
饿汉模式:实例在初始化就已经创建好对象。懒汉模式:在使用实例时进…
目录
- 单例模式
- 1.饿汉模式
- 2.懒汉模式
- 3.双重检查
- 注意:
- 重排序问题:
- 解决:Volatile关键字
- 4.静态内部类
- 5.枚举
单例模式
单例模式主要有5种模式:
- 饿汉模式:实例在初始化就已经创建好对象。
- 懒汉模式:在使用实例时进行判断,若不为null则创建对象,否则直接调用。
- 双重检查:通过锁来双重判断实例是否为null。
- 静态内部类:通过静态内部类去实例化对象。
- 枚举:JDK1.5版本后提供了枚举,天然支持单例模式。
1.饿汉模式
实例在初始化就已经创建好对象,不管有没有使用都会创建,会造成资源浪费。
public class Main {private static Main instance = new Main();private Main(){}public static Main getInstance() {return instance;}
}
2.懒汉模式
实现了懒加载,但是在并发情况下会有多个线程同时进入if条件中,会产生多个实例。
public class Main {private static Main instance;private Main(){}public static Main getInstance() {if (instance != null)instance = new Main();return instance;}
}
3.双重检查
在获取实例时加锁进行双重判断来创建实例。
// 双重检查模式的懒汉单例模式
public class Singleton {private static Singleton instance = null;private Singleton() {}public static Singleton getInstance() {// 若对象为空,在多线程的访问下,多个线程会同时进入该if语句。若对象不为空,直接返回,不用进去排队if (instance == null) {// 对多线程进行排队,防止多次初始化synchronized (Singleton.class) {// 对单个线程进行判断,是否要初始化if (instance == null) {instance = new Singleton(); } } } return instance;}
}
注意:
以上代码可能会出现问题,因为instance = new Singleton()不是一个原子操作,会在执行时拆分成一下几个动作:
- 先进行new操作,JVM会分配内存地址、内存空间。
- 然后使用构造方法实例化对象。
- 最后再进行赋值,instance = 分配好的内存地址(引用保存的对象地址)。
重排序问题:
因为以上3个动作在真正执行时可能是1、2、3顺序,也可能1、3、2顺序,单线程下不影响结果,但多线程下使用1、3、2可能出现的问题:
- 假设A线程执行完1、3步骤(2还没有执行)。
- B线程进入到单例模式的if语句中,会直接得到Instance对象(在没有执行2步骤下),这时若使用该对象(instance.xxx())将会必然报错。
解决:Volatile关键字
在对象变量中加上volatile关键字如下:
private volatile static Singleton instance = null;
4.静态内部类
- 采用了类加载的机制保证实例化只有一个线程。
- 只会在第一次主动调用的时候加载,并且只加载一次。
public class Singleton {// 内部类中实例化对象private static class SingletonInstance {private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonInstance.INSTANCE;}public static void main(String[] args) {Singleton instance = Singleton.getInstance();}
}
5.枚举
enum Singleton {INSTANCE;
}public class Main {public static void main(String[] args) {// 获取实例对象Singleton instance = Singleton.INSTANCE;}
}
- 避免了多线程同步问题。
- 可以防止反序列化后重新创建新对象。