Java 虚拟机对锁优化所做的努力
【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》
作为一款公用平台,JDK 本身也为并发程序的性能绞尽脑汁,在 JDK 内部也想尽一切办法提供并发时的系统吞吐量。这里,我将向大家简单介绍几种 JDK 内部的 "锁" 优化策略。
1、 锁偏向
锁偏向是一种针对加锁操作的优化手段。
如果一个线程获得了锁,那么锁就进入偏向模式。当这个线程再次请求锁时,无须再做任何同步操作。这样就节省了大量有关锁申请的操作,从而提高了程序性能。
因此,对于几乎没有锁竞争的场合,偏向锁有比较红啊的优化效果,因为连续多次极有可能是同一个线程请求相同的锁。而对于锁竞争比较激烈的场合,其效果不佳。因为在竞争激烈的场合,最有可能的情况是每次都是不同的线程来请求相同的锁。点击这里了解几种常见的锁。
2、 轻量级锁
如果偏向锁失败,即上一个请求的锁的线程和这个线程不是同一个。偏向锁失败意味者不能避免做同步操作。此时,虚拟机并不会立即挂起线程。他会使用一种成为轻量级锁的优化手段。
轻量级锁的操作也很方便,它只是简单地将对象头部作为指针,指向蚩尤锁的线程堆栈的内部,来判断一个线程是否持有对象锁。 如果线程获得轻量级锁成功,则可以顺利进入临界区。如果轻量级锁失败,则表示其他线程抢先争夺了锁,那么当前线程的锁请求就会膨胀为重量级锁。点击这里了解几种常见的锁。
3、 自选锁
锁膨胀后,虚拟机为了避免线程真实地在操作系统层面挂起,虚拟机还会在做***的努力–自选锁。由于当前线程暂时无法获得锁,但是什么时候可以获得锁是一个未知数。也许在CPU几个时钟周期后,就可以得到锁。如果这样,简单粗暴的挂起线程可能是一种得不偿失的操作,因此系统会进行一次赌注:它会假设在不久的将来,线程可以得到这把锁。
因此虚拟机让当前线程做个空循环,在经过若干次循环后,如果可以得到锁,那么就顺利进入临界区。如果还不能得到锁,才会真实地将线程在操作系统层面挂起。
4、 锁消除
锁消除是一种更彻底的锁优化。Java虚拟机在JIT编译时,通过对运行上下文的扫描,去除不可能存在共享资源竞争的锁。通过锁消除,可以节省毫无意义的请求锁时间。
下面这种这种情况,我们使用vector, 而vector内部使用了synchronize请求锁。
- public String [] createStrings(){
- Vector<String> v= new Vector<String>();
- for(int i=0;i<100;i++){
- v.add(Integer.toString(i));
- }
- return v.toArray(new String[]{});
- }
由于V只在函数 createStrnigs 中使用,因此它只是一个单纯的局部变量。局部变量是在线程栈上分配的,属于线程私有额数据,因此不可能被其他线程访问。所以,在这种情况下,Vector内部所有加锁同步都是没有必要的。如果虚拟机检测到这种情况,就会将这些无用的锁操作去除。点击这里了解几种常见的锁。
锁消除涉及的一项关键技术为逃逸分析。所谓逃逸分析就是观察某一个变量是否会逃出某一个作用域。在本例中,变量v显然没有逃出createString 函数之外。以此为基础,虚拟机才可以大胆的将v内部的加锁操作去除。如果createStrings 返回的不是String数组,而是v本身,那么就认为变量v逃逸出了当前函数,也就是说v有可能被其他线程访问。如是这样,虚拟机就不能消除v中的锁操作。
逃逸分析必须在 -server 模式下进行,可以使用 -XX:DoEscapeAnalysis 参数打开逃逸分析,使用 -XX:+EliminateLocks 参数可以打开锁消除。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
泽塔云:用超融合撑起软件定义数据中心的梦想
【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》 20年前,来自硅谷的互联网公司建立了云计算基础架构的雏形,成为长达多年的全球IT***。在云计算应用盛行的今天,一批中国本土明星企业冉冉升起,ZETTAKIT泽塔云就是其中的佼佼者。 始于超融合 尽管已经过去快4年,但在公司成立之初,就以自研超融合系统一举拿下国家卫计委的项目,让泽塔云CTO明晨迄今记忆犹新。 2014年,超融合的概念才刚刚在国内落地,很多IT从业者甚至连超融合的名字都没听过。大多数企事业单位还在采用传统IT三层架构,国外厂商VMware的相关产品是当时市场上主流的数据中心虚拟化解决方案。 然而造价极为高昂的VMware虚拟化技术方案,却依然解决不了传统数据中心硬件资源利用率极低、管理运维复杂、存储扩容难等问题。面对日益庞大的业务系统和数据,国家卫计委药具管理中心不得不寻求更好的解决方案。 作为当时国内极少数的超融合厂商,泽塔云提出了一种全新的云计算架构解决方案,即以软件定义的方式,将数据中心所需要的网络、存储、计算全部虚拟化,价格却仅为VMware等虚拟化解决方案的一半。 这个领先的技术方案让国家...
- 下一篇
三分钟了解到底虚拟化平台能做什么?
【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》 今天我们主要来讨论一下虚拟化实现之后,在虚拟化平台上,我们到底可以为客户或者管理员实现哪些方便而实用的虚拟化应用呢? 内存复用 内存复用技术 虚拟化平台上层肯定部署了非常多的虚拟机,这些虚拟机的虚拟内存空间全部要来自于底层硬件所提供的物理内存,所以为了更好的提供虚拟化场景的资源利用率,内存复用策略是其中一个非常重要的模块。内存复用技术主要包含内存共享、内存气泡和内存交换等: 内存气泡指的是虚拟化平台可以主动收回一些暂时没用上的物理内存,分配给需要复用内存的虚拟机使用。例如虚拟机A创建时划分了16G内存,可是运行时只使用了其中的8G内存,那么其余的没有用上的8G内存就是内存气泡,这部分内存空间是可以拿给其他虚拟机进行复用的,并且此操作并不会让虚拟机A感知到; 内存共享指的是多台虚拟机共享相同的物理内存空间,此时虚拟机仅对该部分内存进行只读操作,若要进行修改写,开重新开辟新的内存空间,并重新创建映射关系; 内存交换指的是将虚拟机长时间未访问的内存数据存放到外部存储上,当虚拟机需要这部分数据的时候再将和预留内存上的数据...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS关闭SELinux安全模块
- CentOS8编译安装MySQL8.0.19
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- 设置Eclipse缩进为4个空格,增强代码规范