1 工作内存和主内存.
(1) 主内存: 所有的变量都存储在 主内存中.
(2) 工作内存: 每个线程都有自己独立的工作内存, 里面保存该线程使用到的 变量副本(主内存中该变量的一份拷贝).
2 我们规定:
(1) 线程对共享变量的所有操作都必须在自己的 工作内存 中进行, 不能直接从主内存中读写.
(2) 不同线程之间 无法直接访问其他线程工作内存 中的变量, 线程间变量的传递主要通过 主内存 来完成.
3 修改 线程A中的变量.
(1) 把工作内存A中更新过的共享变量 刷新到主内存中.
(2) 将主内存中的最新共享变量的值 更新到工作内存B中.
如果满足上面两点, 也就是说 线程A中更新的共享变量线程B中能够及时得到更新, 就称为变量是可见的, 反之则是不可见.
4 共享变量: 如果一个变量在 多个线程的工作内存中 都存在副本, 那么这个变量就是这几个线程的共享变量.
可见性: 一个线程对共享变量值的修改, 能够及时地被其他线程看到.
原子性: 一段指令像原子一样不可分割, 也就是一个指令不可分解为多个操作. 在执行结束之前其他线程不可打断.
有序性: 指令重排序 是指 编译器 或 处理器为了提高程序性能而做出的 优化. 在单线程的情况下你不必担心指令重排序带来什么不良后果.
5 共享变量线程不安全的原因.
(1) 一个操作指令可以分解为多条指令, 同时线程交叉执行.(不具有原子性)
(2) 共享变量 更新后的值没有在工作内存中与主内存之间 及时更新.(不具有可见性)
(3) 指令重排序, 同时线程的交叉执行.(不具有有序性)
6 volatile 关键字保证了 可见性 和有序性. 不能保证原子性.
使用条件: 多个变量之间 (或者某个变量)的 当前值与修改后值 之间没有约束.
7 synchronized 关键字保证了 原子性 有序性 可见性.