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

你可能感兴趣的文章
php的一些小笔记--字符串
查看>>
php的几种运行模式CLI、CGI、FastCGI、mod_php
查看>>
php的四大特性八大优势
查看>>
RabbitMQ
查看>>
PHP的威胁函数与PHP代码审计实战
查看>>
PHP的引用举例
查看>>
PHP相关代码
查看>>
RabbitMQ
查看>>
php知识点记录
查看>>
PHP类数组式访问(ArrayAccess接口)
查看>>
PHP系列:浅谈PHP中isset()和empty() 函数的区别
查看>>
PHP索引数组unset的坑-array_values解决方案
查看>>
PHP索引数组排序方法整理(冒泡、选择、插入、快速)
查看>>
PHP线程安全和非线程安全
查看>>
R3LIVE开源项目常见问题解决方案
查看>>
php缃戠珯,www.wfzwz.com
查看>>
php缓存查询函数
查看>>
php编写TCP服务端和客户端程序
查看>>
php编码规范
查看>>
PHP编码规范-PSR1、psr2 /psr3 psr4
查看>>