多线程编程(线程概念图)

JVM编译器

  1.  前端编译器:.java文件到.class文件
  2. JIT 编译器:从字节码到机器码
  3. AOT 编译器:源代码到机器码
这三种编译器的编译速度和编译质量如下:
编译速度上,解释执行 > AOT 编译器 > JIT 编译器。
编译质量上,JIT 编译器 > AOT 编译器 > 解释执行。
 

JVM内存图

  1. 每个线程都有独立的栈空间
  2. 每个线程都可以访问堆内存
  3. 计算机的CPu不直接从主内存中读取数据,CPU读取数据时,先把主内存的数据读到Cache缓存中,把cache中的数据读到Register寄存器中
  4. JVM中的共亨的数据可能会被分配到Register寄存器中,每个CPU都有自己的Register寄存器,一个CPU不能读取其他CPU上寄存器中的内容.如果两个线程分别运行在不同的处理器(CPU)上,而这个共享的数据被分配到寄存器上,会产生可见性问题.
  5. 即使JVM中的共享数据分配到主内存中,也不能保证数据的可见性.CPU不直接对主内存访问,而是通过Cache高速缓存进行的一个处理器上运行的线程对数据的更新可能只是更新到处理器的写缓冲器(Store Buffer),还没有到达Cache缓存,更不用说主内存了.另外一个处理器不能读取到该处理器写缓冲器上的内容,会产生运行在另外一个处理器上的线程无法看到该处理器对共享数据的更新.
  6. 一个处理器的Cache不能直接读取另外一个处理器的Cache.但是一个处理器可以通过缓存—致性协议(Cache Coherence Protocol)来读取其他处理器缓存中的数据,并将读取的数据更新到该处理器的Cache中.这个过程称为缓存同步.缓存同步使得一个处理器上运行的线程可以读取到另外一个处理器上运行的线程对共享数据的所做的更新,即保障了可见性.为了保障可见性,必须使一个处理器对共享数据的更新最终被写入该处理器的Cache,这个过程称为冲刷处理器缓存

JVM简化图

规定:

  1. 每个线程之间的共亨数据都存储在主内存中
  2. 每个线程都有一个私有的本地内存(工作内存),线程的工作内存是抽象的概念,不是真实存在的,它涵盖写缓冲器,寄存器,其他硬件的优化。
  3. 每个线程从主内存中把数据读取到本地工作内存中,在工作内存中保存共享数据的副本,线程在自己的工作内存中处理数据,仅对当前线程可见,对其他线程是不可见的
原文地址:https://www.cnblogs.com/five-five/p/13696819.html