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

你可能感兴趣的文章
Netty核心模块组件
查看>>
Netty框架的服务端开发中创建EventLoopGroup对象时线程数量源码解析
查看>>
Netty源码—2.Reactor线程模型一
查看>>
Netty源码—4.客户端接入流程一
查看>>
Netty源码—4.客户端接入流程二
查看>>
Netty源码—5.Pipeline和Handler一
查看>>
Netty源码—6.ByteBuf原理二
查看>>
Netty源码—7.ByteBuf原理三
查看>>
Netty源码—7.ByteBuf原理四
查看>>
Netty源码—8.编解码原理二
查看>>
Netty源码解读
查看>>
Netty的Socket编程详解-搭建服务端与客户端并进行数据传输
查看>>
Netty相关
查看>>
Network Dissection:Quantifying Interpretability of Deep Visual Representations(深层视觉表征的量化解释)
查看>>
Network Sniffer and Connection Analyzer
查看>>
NetworkX系列教程(11)-graph和其他数据格式转换
查看>>
Networkx读取军械调查-ITN综合传输网络?/读取GML文件
查看>>
Net与Flex入门
查看>>
net包之IPConn
查看>>
NFinal学习笔记 02—NFinalBuild
查看>>