线程安全
线程
线程状态转移图
-
什么是线程安全?
程序运行的结果完全符合预期,不会出现有时正确,有时错误。即(消除随机性并且正确) -
线程不安全的原因是什么?
- Java中的语句,对应不一定是一条字节码文件,更不一定是一条CPU指令
- 线程调度中有随机性存在。什么时候从 CPU上被调度下来 以及什么时候被调度回CPU上
-
什么情况会出现线程不安全?
1. 线程之间有共享的数据。即线程之间不存在共享,天生是线程安全的。
2. 即使线程之间有共享,但没有线程修改共享数据,则天生是线程安全的。 -
JVM的运行时内存区域中,哪些位置是共享的?那些是线程内部私有的?
1. nextPC值—PC区域 私有
2. 栈区(Java栈/native栈) 私有
3. 堆区 共享
4. 方法去 共享
5. 运行时常量池 共享
- 局部变量是线程私有的数据,不会共享,不需要特别考虑线程安全问题。
- 属性/对象+静态属性/类,是共享的,需要考虑线程安全问题。
基本数据类型和引用数据类型的区别
- 一旦运行起来,所有的变量,本质上在JVM看来就是一块内存
- 基本数据类型的值的使用,是直接过程
- 引用数据类型的值的使用,是间接过程
带来线程不安全的三个重要知识点
1. 原子性–(认为原子不可以再分割)
一组需要保证不能再分割的操作,就称位保证原子性
2.代码可见性
3. 代码重排序