1.1 Java 内存模型
Java 内存模型的主要目的是定义程序中的各种变量的访问规则,即关注在虚拟机中把变量值存储到内存和从内存中取出变量值的底层细节
Java内存模型规定了所有的变量都存储在主内存(Main Memory)中,每条线程还有自己的工作内存(Working Memory)线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的数据,不同的线程也无法访问对方工作内存中的变量,线程间变量值的传递均需通过主内存来完成。
Java内存模型是围绕并发过程中如何处理原子性、可见性、有序性来建立的。
原子性:通过 synchronized、LOCK解决
可见性:一个线程对变量的修改另一个线程能够立即察觉到,通过synchronized、LOCK、volatile来解决
有序性:通过volatile 和 hapen-before原则保证
1.2 volatile
1)保证共享变量的可见性
2)禁止代码重排序
1.3 内存屏障
1)ifence 是一种读屏障(Load Barrier)
2) sfence 是一种写屏障(Store Barrier)
3) mfence 是一种全能型的屏障,具备ifence 和 sfence 的能力
4) LOCK 前缀lock 不是一种内存屏障,但是它能完成类似内存屏障的功能,lock会对CPU总线和高速缓存加锁。可以理解为CPU指令集的一种锁
1.4 线程的6种状态
1)新建(New) : 创建后尚未启动的线程处于这种状态
2)运行(Runnable):包括操作系统线程中的Running 和 Ready 状态,也就是说线程正在执行,或者线程正在等待CPU
3)无限期等待(Waiting):处于这种状态的线程不会被分配CPU执行时间,要被其他线程显示唤醒。
a. 没有设置超时时间的 wait() 方法
b. 没有设置超时时间的 join() 方法
c. LockSupport.park
4) 限期等待(Timed Waiting):处于这种状态的线程也不会被分配CPU执行时间,但是无需等待被其他线程显示唤醒,在等待一定时间后,他们由系统自动唤醒
a. Thread::sleep
b. 设置了超时时间的 Object::wait
c. 设置了超时时间的 Object::join
d. LockSupport::parkNanos
e. LockSupport::parkUntil
5) 阻塞(Blocked):“阻塞状态”与“等待状态”的区别是“阻塞状态”在等待获取一个排它锁,这个事件将在另一个线程放弃这个锁的时候发生;而“等待状态”则是在等待一段时间,或者唤醒动作的发生。在程序进入同步区域的时候,线程将进入这种状态
6) 结束(Terminated):已终止的线程的状态,线程已结束执行