多线程系列(三):java 中的线程基本概念

1.原子性

操作不可被中断

2.可见性

线程修改共享变量的值,其他线程能立刻知道这个修改。

缓存优化,硬件优化,指令重排,编辑器优化均有可能导致线程的修改不会立即被其他线程察觉,导致可见性问题。

3.有序性

一条指令执行步骤:

1.取指 IF : 寄存器和存储器相关

2.译码   取寄存器操作数 ID :指令寄存器组

3.执行或有效地址计算 EX : 算术逻辑单元ALU,是CPU的执行单元,CPU核心单元,要负责二进制的算术运算

4.寄存器访问 MEM : 

5.写回 WB : 寄存器组

CPU的流水线技术-指令在执行IF之后,其他指令可以马上跟上,商用CPU达到了10级流水线的级别。支持10个指令同时运行。流水线满载的情况下,性能最高。但一旦被中断,就会卡死。再次满载有需要几个周期。性能损失严重。因此,需要想办法不让流水线中断。

指令重排技术可以减少流水线中断。防止流水线中断技术很多【1】。

指令重排,可以提高指令流水线运行效率,从而提高执行效率。

无法重排的指令: Happen-Before规则

1. 程序顺序原则:一个线程内保证语义的串行性;  存在先后逻辑依赖关系的语句不能重排。

2.volatile规则:volatile变量的写,先发生于读。

3.锁规则: 解锁 必然发生在随后的加锁前。 如果对一个锁解锁,再加锁,那么加锁的动作不能重排到解锁动作之前,否则加锁行为将无法获取锁。

4.传递性:A->B->C , 则 A->C

5.线程的start() 最先开始

6.线程所有操作终止于Thread.join()

7.线程的中断interrupt()先于被中断线程的代码。

8.对象的构造函数执行、结束先于finalize()方法

你可能感兴趣的:(多线程系列(三):java 中的线程基本概念)