JVM规范定义了java内存模型(Java memory Model )来屏蔽掉各类操做系统、虚拟机实现厂商和硬件的内存访问差别,以确保java程序在全部操做系统和平台上可以实现一次编写、处处运行的效果。java
java 内存模型的指定既要严谨,保证语义无歧义,还要尽可能制定的宽松一些,容许各硬件和虚拟机实现厂商有足够的灵活性来充分利用硬件的特性提高java的内存访问性能。睡着JDK的发展,java的内存模型已经逐渐成熟起来。web
1.工做内容和主内存服务器
java内存模型规定全部的变量都存储在主内存中(JVM内存的一部分),每一个线程有本身独立的工做内存,它保存了被该线程使用的变量的主内存复制。线程对这些变量的操做都在本身的工做内存中进行,不能直接操做主内存和其余工做内存汇总存储的变量或者变量副本。线程间的变量访问需经过主内存来完成,三者的关系如图所示:
多线程
2. Java内存交互协议
Java内存模型定义了8种操做来完成主内存和工做内存的变量访问,具体以下:并发
lock: 主内存变量,把一个变量标识为某个线程独占的状态。性能
unlock: 主内存变量,把一个处于锁定状态的变量释放出来,被释放后的变量才能够被其余线程锁定。spa
read:主内存变量,把一个变量的值从主内存传输到线程的工做内存中,以便随后的load动做使用。操作系统
load:工做内存变量,把read读取到的主内存中的变量值放入工做内存的变量副本中。线程
use:工做内存变量,把工做内存中的变量的值传递给JAVA虚拟机执行引擎,每当虚拟机遇到一个须要使用到变量值的字节码指令时,将会执行该操做。orm
assign:工做内存变量,把从执行引擎接受到的变量的值赋值给工做变量,每当虚拟机遇到一个给变量赋值的字节码时,将会执行该操做。
store:工做内存变量,把工做内存中一个变量的值传送到主内存中,以便随后的write操做使用
write:主内存变量,把store操做从工做内存中获得的变量值放入主内存的变量中。
3.java的线程
并发能够经过多种方式来实现,例如:单进程—单线程模型,经过在一台服务器上启动多个进程来实现多任务的并行处理。可是在JAVA语言中,一般是经过单进程—多线程的模型进行多任务的并发处理。所以,咱们有必要熟悉一下java的线程。
你们都知道,线程是比进程更轻量级的调度执行单元,它能够把进程的资源分配和调度执行分开,各个线程能够共享内存、I/O等操做系统资源,可是又可以被操做系统发起的内核线程或者进程执行。各线程能够独立的启动、运行和中止,实现任务的解耦。
主流的操做系统提供了线程实现,目前实现线程的方式主要有三种,分别以下。
(1) 内核线程(KLT)实现,这种线程有内核来完成线程切换,内核经过线程调度器对线程进行调度,并负责将线程任务映射到不通的处理器上。
(2)用户线程实现(UT),一般状况下,用户线程指的是彻底创建在用户空间线程库上的线程,用户线程的建立、启动、运行、销毁和切换彻底在用户态中完成,不须要内核的帮助,所以执行性能更高
(3)混合实现,将内核线程和用户线程混合在一块儿使用的方式。
因为虚拟机规范并无强制规定java的线程必须使用哪一种方式实现,所以,不一样的操做系统实现的方式也可能存在差别。对于SUN的JDK,在Windows和Linux操做系统上采用了内核线程的实现方式,在Solaris版本的JDK中,提供了一些专有的虚拟机线程参数,用于设置使用哪一种线程模型。