Java线程与内存模型

1.工作流程图

13932428-ec39f4e0e4680c05.png
线程操作内存图

2.内存之间的交互操作

  • 2.1 Lock (锁定): 把一变量标识为一条线程独占的状态
  • 2.2 unlock (解锁) : 把处于锁定状态的变量释放出来
  • 2.3 read (读取) : 把一个变量从主内存加载到工作内存
  • 2.4 load (载入) : 把工作内存中的变量值复制到变量副本当中
  • 2.5 use (使用) : 将值传递给工作引擎
  • 2.6 assign (赋值) : 把从执行引擎接收到的值传递给工作内存的变量
  • 2.7 store (存储) : 把工作变量当中的值传送到主内存当中,之后可以进行write操作
  • 2.8 write (写入) : 把操作完成之后的值写到主内存的对应变量当中

3.volatile类型变量的特殊规则

  • 3.1 可见性:只要是volatile修饰的变量,那么只有有任一个线程对该变量进行了修改,那么这次的修改对所有线程就是可见的,不会出现脏读或者是幻读的问题
  • 3.2 禁止指令重排序优化,保证代码顺序执行,防止其他线程抢占式串行执行

4.对于long和double类型的特殊规则

Java内存模型当中上述2.1~2.8的所有操作都是要求要具备原子性的,但是对于64位的数据类型long和double来说却是需要分割成来此来进行操作的

5.Java线程调度

  • 协同式调度
    • 优点是线程顺序执行,每个线程执行完成之后通知下一个线程执行,线程的切换时可知的
    • 缺点是一旦有一条线程的代码出现问题,一直不通知下一个线程,那么就可能导致线程的阻塞问题
  • 抢占式调度
    • 优点是线程的切换是随机的,切换速度快,不容易出现线程阻塞问题

转载于:https://www.jianshu.com/p/eabf91468e2c

猜你喜欢

转载自blog.csdn.net/weixin_33958366/article/details/91103727