Java有序性案例
2023-06-13 09:12:15 时间
Java
有序性案例
代码
/**
* @author 晓果冻
*/
public class SingleInstance {
private static SingleInstance instance;
private SingleInstance(){};
public static SingleInstance getInstance(){
if(instance == null){
synchronized (SingleInstance.class){
if(instance == null){
instance = new SingleInstance();
}
}
}
return instance;
}
}
执行流程
顺序性问题点
instance = new SingleInstance();//这行代码包括如下三个步骤
- 分配内存空间
- 初始化对象
- 将instance引用指向内存空间。
假设执行顺序:
- 线程
A
和线程B
同时进入第一个if
条件判断。 - A线程首先获取到
synchronized
锁,进入代码块,此时instance为null
,所以执行instance=new SingleInstance()
语句。 - 在执行
instance = new SingleInstance();
时,线程A在JVM
开辟一块空白的内存空间。 - 线程A将instance引用指向空白的内存空间,在没有进行对象初始化时,发生了线程切换,线程
A
释放锁。 - 线程B拿到锁,发现
instance
不为null
,但此时instance
并未初始化,是一个空对象。如果线程B
使用instance
对象,可能就会出现问题。
相关文章
- java用什么软件_Java编程什么软件最好用?
- java 音频转为wav格式标准音频 | Java工具类
- java的运行环境是什么_Java运行环境是什么
- Java后台接收参数出现java.lang.Integer cannot be cast to java.lang.Double错误(已解决)[通俗易懂]
- Java核心技术卷一学习笔记1
- 【说站】java线程池中类的继承探究
- JAVA项目集锦 Java项目视频20套
- 安装java脚本
- 堪称神级!GitHub上标星157K的Java教程,全程干货,只讲重点
- java通用加密
- 【云驻共创】 JAVA常用的开发工具有哪些?
- Java下使用Redis进行高效缓存优化(Redis缓存java)
- MySQL与Java的连接:指南与实践(mysqljava连接)
- 策略解析Redis中Java实现的过期策略(redisjava过期)
- 实战探索:Java中使用Redis缓存(java的redis案例)
- 挑战未来:学习Linux与Java(学linux还是java)
- 时间Java 如何设置Redis的过期时间(redisjava过期)
- Java操作Linux系统:让命令行更轻松(java操作linux)
- 基于Linux操作系统上实现 Java 编程(linux r java)
- 数据Java操作MySQL库:获取你所需的数据(java获取mysql)
- Java解答Oracle使用更轻松的实现方式(oracle写成java)
- 通往成功的道路通过Java考证Oracle获取更高的成就(java考证oracle)
- 进行操作学会使用Java玩转Redis(在java中队redis)
- 零基础写Java知乎爬虫之获取知乎编辑推荐内容