博客
关于我
JVM虚拟机深入理解----Java内存模型与线程(并发)
阅读量:710 次
发布时间:2019-03-17

本文共 783 字,大约阅读时间需要 2 分钟。

硬件效率与一致性

由于物理机遇到的并发问题与虚拟机中的情况有不少相似之处,因此物理机对于并发的处理方案对于虚拟机的并发处理有很大的参考意义。计算机的存储设备与处理器速度差距巨大,为了解决这一问题,我们在处理器与存储设备之间引入了高速缓存(Cache)。缓存的作用是将运算需要的数据存储在处理器中,等待处理器完成计算后,将结果返回缓存,再通过缓存存入到内存中。

然而,缓存带来了新的问题——缓存一致性问题。每个处理器都有自己的高速缓存,而所有处理器共享一个主内存。这种情况可能导致数据不一致。为了解决这一问题,我们引入了缓存一致性协议,包括MSI、MESI、MOSI等协议。

Java内存模型

Java虚拟机规范试图将Java内存模型适用于当前主流的硬件和操作系统,从而保证Java程序在各个平台下都能实现一致性的内存访问效果。

主内存与工作内存

Java内存模型定义了程序中变量的访问规则。变量可以是线程中的共享变量。在Java内存模型中,主内存与工作内存的概念与物理机中的主内存与高速缓存类似。主内存对应于Java堆中的对象实例数据部分,工作内存对应于虚拟机中的栈部分区域。

为了保证并发程序的正确性,Java引入了线程同步机制。最常用的同步机制是自旋锁。自旋锁的优点是减少了线程等待的时间,但也存在争夺锁的性能问题。为了更好地应对这一难题,Java引入了自适应自旋锁。

自旋锁与自适应自旋锁

传统自旋锁的缺点是如果争夺锁的时间很长,反而会浪费处理器资源。为了优化这一问题,Selfadel和"Nowik"提出了自适应自旋锁的概念。自适应自旋锁的核心思想是:根据之前锁的自旋时间和当前锁的状态,动态调节自旋等待的时间。

这种自适应机制能够更好地平衡资源浪费与性能损失,使得在多数情况下都能达到理想的性能。在实际应用中,自适应自旋锁在多线程场景中显示出了明显的优势。

转载地址:http://eybhz.baihongyu.com/

你可能感兴趣的文章
oracle中新建用户和赋予权限
查看>>
Oracle中的NVL,NVL2,NULLIF以及COALESCE函数使用
查看>>
Oracle中的rownum 和rowid的用法和区别
查看>>
oracle中的大小写、字符、dual、数字、处理、日期、函数、显/隐式、时间、条件表达式case、decode、to_date、to_char、sysdate
查看>>
oracle中表和视图的区别,oracle中常用表和视图
查看>>
oracle之表空间(tablespace)、方案(schema)、段(segment)、区(extent)、块(block)
查看>>
Oracle从11g导出后导入10g
查看>>
oracle从备份归档日志的方法集中回收
查看>>
oracle优化器analyzed,Oracle 学习之 性能优化(十三) 索引
查看>>
Oracle修改字段类型
查看>>
Oracle修改表或者字段的注释
查看>>
oracle典型安装失败,安装oracle 10失败
查看>>
Oracle内存结构详解(四)--Oracle SGA其他组成部分
查看>>
Oracle函数与存储过程和程序包
查看>>
Oracle分析函数之LEAD和LAG
查看>>
Oracle分组取前n条记录
查看>>
Oracle创建database link(dblink)和同义词(synonym)
查看>>
oracle创建数据库的步骤
查看>>
Oracle创建用户、角色、授权、建表
查看>>
Oracle创建用户与授予表空间与权限
查看>>