《深入理解Java虚拟机》十二:Java内存模型与线程

Java虚拟机定义了一种Java内存模型来屏蔽掉各种硬件和操作系统内存的内存访问差异,实现各种平台下达到一致性的内存访问效果。

大纲

Java内存模型与线程

硬件的效率与一致性

计算机的存储设备与处理器的运算速度有几个数量级的差距,现在计算机系统加入高级缓存来作为内存与处理器之间的缓存,但是要处理缓存一致性的问题。

Java内存模型

主要目标

Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。
Java内存模型规定了所有的变量都存储在主内存(虚拟机内存的一部分)中,每条线程还有自己的工作内存(类似处理器的高速缓存),保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量。

image-20180802064625797

那从变量、主内存、工作内存的定义来看,主内存主要对应于Java堆中的对象实例数据部分,而工作内存则对应于虚拟机栈中的部分区域。

交互关系

关于主内存与工作内存之间具体的交互协议,Java内存模型中定义了以下8种操作确保每一种操作都是原子的、不可再分的。
8种原则子操作:

  • lock(锁定)
  • unlock(解锁)
  • read(读取)
  • load(载入)
  • use(使用)
  • assign(赋值)
  • store(存储)
  • write(写入)

这8种操作外加volatile关键字等判断起来有点繁琐,可以采用一个等效判断原则:先行发生原则

先行发生原则

先行发生原则是Java内存模型中定义的两项操作之间的偏序关系,如果说操作A先行发生于操作B,其实就是说在发生操作B之前,操作A产生的影响能被操作B观察到,“影响”包括修改了内存中共享变量的值、发送了消息、调用了方法等。
8种推导原则:

  • 程序次序规则
  • 管程锁定规则
  • volatile变量规则
  • 线程启动规则
  • 线程终止规则
  • 线程中断规则
  • 对象终结规则
  • 传递性

volatile

Java虚拟机通过关键字volatile提供了最轻量级的同步机制

  • 保证此变量对所有线程的可见性
  • 禁止指令重排序优

Java并发过程的3个特性

  • 原子性
    • synchronized关键字
  • 可见性
    • volatile,synchronized,final关键字
  • 有序性
    • volatile,synchronized关键字

Java与线程

实现线程的方式

  • 使用内核线程实现
  • 使用用户线程实现
  • 使用用户线程加轻量级进程混合实现

Java线程调度

线程调度是指系统为线程分配处理器使用权的过程,分别为

  • 协同式线程调度
  • 抢占式线程调度(Java使用)

状态切换

Java语言定义了5种线程状态,分别为

  • 新建(new)
  • 运行(Runable)
  • 等待
    • 无限期等待(Waiting)
    • 限期等待(Timed Waiting)
  • 阻塞(Blocked)
  • 结束(Termianted)

image-20180802071006086

公众号:亦袁非猿

欢迎关注,交流学习