博客
关于我
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/

你可能感兴趣的文章
Numpy:按多个条件过滤行?
查看>>
Numpy:条件总和
查看>>
numpy、cv2等操作图片基本操作
查看>>
numpy中的argsort的用法
查看>>
NumPy中的精度:比较数字时的问题
查看>>
numpy判断对应位置是否相等,all、any的使用
查看>>
Numpy如何使用np.umprod重写range函数中i的python
查看>>
numpy学习笔记3-array切片
查看>>
numpy数组替换其中的值(如1替换为255)
查看>>
numpy数组索引-ChatGPT4o作答
查看>>
NUMPY矢量化np.prod不能构造具有超过32个操作数的ufunc
查看>>
Numpy矩阵与通用函数
查看>>
numpy绘制热力图
查看>>
numpy转PIL 报错TypeError: Cannot handle this data type
查看>>
Numpy闯关100题,我闯了95关,你呢?
查看>>
Nutch + solr 这个配合不错哦
查看>>
NuttX 构建系统
查看>>
NutUI:京东风格的轻量级 Vue 组件库
查看>>
NutzCodeInsight 2.0.7 发布,为 nutz-sqltpl 提供友好的 ide 支持
查看>>
NutzWk 5.1.5 发布,Java 微服务分布式开发框架
查看>>