java内存模型

来源:互联网 发布:sina邮箱端口imap 编辑:程序博客网 时间:2024/06/07 06:05

JVM规范定义了java内存模型 来屏蔽掉各种操作系统、虚拟机实现厂商和硬件的内存访问差异,以确保java程序在所有操作系统和平台上能够实现一次编写到处运行的效果


1.工作内存和主内存


java内存模型规定所有的变量都存储在主内存中(JVM内存的一部分) 每个线程有自己独立的工作内存,他保证了被该线程使用的变量的主内存复制,线程对这些变量的操作都在自己的工作内存中进行,不能直接操作主内存和其他工作内存中变量或者变量的副本,线程变量的访问需要主内存来完成


java内存模型定义了8中操作来完成主内存和工作内存的变量访问,具体如下:

1.lock:主内存变量,把一个变量标识为某个线程独占的状态

2.unlock:主内存变量。把一个处于锁定状态的变量释放出来,被释放后的变量才可以被其他线程锁定。

3.read 主内存变量,把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用。

4.load:工作内存变量,把read读取到的内存中的变量的值放入工作内存的变量副本中

5.use: 工作内存变量,把工作内存中的变量的值传递给java虚拟机执行引擎,每当虚拟机遇到一个需要使用到变量的字节码指令时,将会执行该操作

6.assign:工作内存变量,把从执行引擎收到的变量负值给工作变量,每当虚拟机遇到一个给变量负值的字节码时,会执行该操作

7。store:工作内存变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write操作使用

8.write:主内存变量,把store操作从工作内存中得到的变量值放入主内存的变量中



线程是比进程更轻量级的调度执行单元,它可以把进程的资源分配和调度执行分开,各个线程可以共享内存,I/O等操作系统资源,但是又能够被操作系统发起的内核线程或者进程执行。各线程可以独立的启动、运行和停止,实现任务的结偶。


主流的操作系统提供了线程实现,目前实现线程的方式主要有三种,分别如下:

1.内核线程实现,这种线程由内核来完成线程的切换,内核通过线程调度其对线程进行调度,并负责线程任务映射到不同的处理器上

2.用户线程实现,通常情况下,用户线程指的是完全建立在用户空间线程库上的线程,用户线程的创建,启动和运行销毁和切换完全在用户态中完成,不需要内核的帮助,因此执行性能更高



当一个线程被volatile修饰后,它将具备以下两种特性。

线程可见性:当一个线程修改了被volatile修饰的变量后,无论是否枷锁,其他线程都可以看到消息的修改,而普通变量却做不到这点

禁止指令重排序优化



volatile适合使用的是一个线程写,其他线程读的情况,如果有多个线程并发写操作,仍然需要使用锁或者线程安全的容器或者原子变量来代替