![](https://csdnimg.cn/release/download_crawler_static/87790491/bg6.jpg)
2.jdk 用到单例模式的有哪些?
volatile 关键字:简单理解:线程修改值后,马上将值存放到主内存,所有子线程都可
见
1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,
这新值对其他线程来说是立即可见的。
2)禁止进行指令重排序。
@1.Runtime
第一种:懒汉式:
public static synchronized UserModel getInstance() {
if (userModel == null) {
userModel = new UserModel();
}
return userModel;
第二种:饿汉式
public static UserModel getInstance(){
return new userModel();
第三种:双重检索式:双重检索的方式,可以说是在性能和安全两个角度找了一个平衡
点,可以理解为懒汉式单例模式的加强版,既考虑性能又考虑安全性的问题。
public static UserModel getInstance() {
if (userModel == null) {
synchronized (DoubleCheckSingletonPattern.class) {
if (userModel == null) {
userModel = new UserModel();
}
}
}
return userModel;
问题点:隐患补充:这里隐藏着一个问题,当两个线程进来后,先获取锁的线程开始创
建线程的同时,第二个线程进入判断,因为构造对象的过程可能会比较长,
这时第一个线程还未完成对象的完整创建,但第二个线程会拿到一个不是 null 的值,从
而认为已经构造完成,导致返回的类并非是一个完整的对象。解决方案可以通过 volatile 来
解决这个问题,完美的解决了这个问题的还是推荐使用内部类的创建方式
第四种:注册登记式:Spring 框架中 IOC 容器就采用的这种方式来管理我们系统中的
Bean 对象
private final static Map<String, Object> objectsMap = new ConcurrentHashMap<>();
public static synchronized Object getInstance() {
String key = "&userModel";