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适合使用的是一个线程写,其他线程读的情况,如果有多个线程并发写操作,仍然需要使用锁或者线程安全的容器或者原子变量来代替
- java内存模型 内存屏障
- Java内存模型
- Java内存模型
- java内存模型详解
- 12.Java内存模型
- java内存模型详解
- Java内存模型
- Java内存模型详解
- java 内存模型
- Java 内存模型
- Java内存模型
- java内存模型详解
- java内存模型详解
- java内存模型详解
- Java内存模型
- Java内存模型
- 浅谈java内存模型
- JAVA内存模型
- 周中训练笔记+CodeForces
- SQL 不常用的一些命令sp_OACreate,xp_cmdshell,sp_makewebtask
- 面向对象思考及go实现继承与多态
- tomcat 请求返回空白页
- C语言中堆和栈的区别
- java内存模型
- 赛車pk拾88八码滚雪球走势技巧~&
- MyBatis动态sql_bind绑定
- javascript中call、apply、bind区别
- 九九乘法表3
- 如何突破JAVA程序员三年的门槛
- 【Latch】的理解
- 10.创新与企业家精神——聪明的创意
- 关于动态的新增输入框和删除