Java 内存模型
Java 内存模型的主要目的是定义程序中的各种变量的访问规则,即关注在虚拟机中把变量值存储到内存和从内存中取出
变量值的底层细节
Java内存模型规定了所有的变量都存储在主内存(Main Memory)中,每条线程还有自己的工作内存(Wor
king 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):已终止的线程的状态,线程已结束执行