1,硬件的效率与一致性问题
由于cpu的运算速度与计算机内存io的速度差几个数量级,所以为了提升cup的利用率,不得不在cup和内存之间加上一层桥梁--高速缓存,计算机可以将数据从内存复制到高速缓存中,cup就可以直接与高速缓存通讯,然后将计算结果再复制回内存。但是当有多个线程同时计算的时候,可能数据复制的时候会并发的执行,这时候就出现了数据一致性问题
2,java内存模型
(1)内存间交互操作
- lock:想成锁住主内存中的一个变量
- unlock:释放锁住的主内存
- read:将主内存变量的值传递到工作内存中
- load:将主内存传递到工作内存的变量放到工作内存的变量副本中
- use:将工作内存变量值传递给执行引擎
- assign:将执行引擎计算的值赋值给工作内存
- store:将工作内存变量传递给主内存
- write:将传递给主内存变量存入主内存变量中
(2)对于volatile型变量的特殊规则
- 使用volatile修饰变量可以保证此变量的可见性,并且禁止volatile代码前后的指令重排序
- volatile读操作跟普通变量没有区别,但是写的话会慢一些,因为代码中插入和许多内存屏障指令来保证处理器不发生乱序执行。
- use操作必须在load和read相关联,必须一起出现
- assign,store,write必须联系一起出现
(3)内存模型的特性
- 原子性:
- 可见性:使用volatile ;final;synchronized 可以实现。
- 有序性:cup会有指令重排序的可能。使用volatile或synchronized可以实现有序性。
(4)线程状态转换