线程安全

线程

线程状态转移图
线程安全

  1. 什么是线程安全?
    程序运行的结果完全符合预期,不会出现有时正确,有时错误。即(消除随机性并且正确)

  2. 线程不安全的原因是什么?

    1. Java中的语句,对应不一定是一条字节码文件,更不一定是一条CPU指令
    2. 线程调度中有随机性存在。什么时候从 CPU上被调度下来 以及什么时候被调度回CPU上
  3. 什么情况会出现线程不安全?
    1. 线程之间有共享的数据。即线程之间不存在共享,天生是线程安全的。
    2. 即使线程之间有共享,但没有线程修改共享数据,则天生是线程安全的。

  4. JVM的运行时内存区域中,哪些位置是共享的?那些是线程内部私有的?
    1. nextPC值—PC区域 私有
    2. 栈区(Java栈/native栈) 私有
    3. 堆区 共享
    4. 方法去 共享
    5. 运行时常量池 共享

线程安全

线程安全

  1. 局部变量是线程私有的数据,不会共享,不需要特别考虑线程安全问题。
  2. 属性/对象+静态属性/类,是共享的,需要考虑线程安全问题。

基本数据类型和引用数据类型的区别

  1. 一旦运行起来,所有的变量,本质上在JVM看来就是一块内存
    1. 基本数据类型的值的使用,是直接过程
    2. 引用数据类型的值的使用,是间接过程

带来线程不安全的三个重要知识点
1. 原子性–(认为原子不可以再分割)
一组需要保证不能再分割的操作,就称位保证原子性
线程安全
2.代码可见性
线程安全
线程安全
线程安全
3. 代码重排序