• 锁偏向
     是一种加锁操作的优化手段,他的核心思想是:如果一个线程获得了锁,那么就进入偏向模式,当这个线程再次请求锁时,无须在做任何同步操作,因此在几乎没有锁竞争的场合,偏向锁是比较好的优化效果,因为连续多次极有可能是同一个线程请求同一个相同的锁,对于锁竞争比较激烈的场合,其效果不佳,因为竞争激烈的场合,最有可能的情况是每次都是不同的线程来请求相同的锁,这样偏向模式就会失效,使用Java虚拟机参数-XX:+UseBiasedLocking可以开启偏向锁,
  • 轻量级锁
     如果偏向锁失败,虚拟机并不会立即挂起线程,他还会使用一种称为轻量级锁的优化手段,轻量级锁的操作也很方便,它只是简单地将对象头部作为指针,指向持有锁的线程堆栈内部,来判断一个线程是否持有对象锁,如果线程获取轻量级锁成功,则可以顺利进入临界区,如果轻量级锁加锁失败,则表示其他线程抢险争夺到了锁,那么当前线程的锁请求就会膨胀为重量级锁
  • 自旋锁
     锁膨胀后,虚拟机为了避免线程真实的在操作系统层面挂起,虚拟机还会在做最后的努力,自旋锁,由于当前线程暂时无法获得锁,但什么时候可以获得锁是一个未知数,也许几个cpu时钟周期,就可以得到锁,如果这样,简单粗暴地挂起线程可能是一种得不偿失的操作,因此,系统会进行一次赌注,他会假设在不久的将来,线程可以得到这把锁,因此,虚拟机会让当前线程做几个空循环,在经过若干次循环后,如果可以得到锁,那么就顺利进入临界区,如果还是得不到锁,才会真实地将线程在操作系统层面挂起,
  • 锁消除
     锁消除是一种更彻底的锁优化,Java虚拟机在Jit编译时,通过对运行上下文的扫描,去除不可能存在共享资源竞争的锁,通过锁消除,可以节省毫无意义的请求锁的时间,如果不可能存在竞争,为什么还要加锁呢?这是因为咋Java软件开发过程中,我们必然会使用一些JDK的内置API,比如StringBuffer,Vector等,你在使用的时候,也许根本不会考虑这些对象内部是如何实现的,但是真实环境中,缺不存在竞争,如果虚拟机检测到这种情况,就会将这些无用的锁操作去除,
public String[] createStrings() {
Vector<String> v = new Vector<>();
for (int i = 0; i < 100; i++) {
v.add(Integer.toString(i));
}
return v.toArray(new String[]{});
}
     锁消除涉及一项关键技术为逃逸分析,所谓逃逸分析就是观察某一个变量是否会逃出某一个作用域,在本例子中,变量v显然没有逃出createStrings()方法之外,以此为基础,虚拟机才可以大胆地将v内部的加锁操作去除,
     逃逸分析必须在-server模式下进行,可以使用-XX:+DoEscapeAnalysis参数打开逃逸分析.使用-XX:+EliminateLocks参数可以打开锁消除.

Java虚拟机对锁优化所做的努力(读书笔记)的更多相关文章

  1. Java 虚拟机对锁优化所做的努力

    作为一款公用平台,JDK 本身也为并发程序的性能绞尽脑汁,在 JDK 内部也想尽一切办法提供并发时的系统吞吐量.这里,我将向大家简单介绍几种 JDK 内部的 "锁" 优化策略. 1 ...

  2. 深入理解多线程(五)—— Java虚拟机的锁优化技术

    本文是<深入理解多线程>的第五篇文章,前面几篇文章中我们从synchronized的实现原理开始,一直介绍到了Monitor的实现原理. 前情提要 通过前面几篇文章,我们已经知道: 1.同 ...

  3. Java虚拟机的锁优化

    1 锁偏向.当现成请求一个对象锁时,如果获得锁,则该对象锁进入偏向模式,当该线程再次请求该对象的锁时,无需再做任何同步操作. 可通过在Java虚拟机中开启参数-XX:+UseBasedLock开启偏向 ...

  4. Java多线程编程实战指南(核心篇)读书笔记(五)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76730459冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  5. Java多线程编程实战指南(核心篇)读书笔记(二)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76651408冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  6. Java多线程编程实战指南(核心篇)读书笔记(一)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76422930冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  7. Java多线程编程实战指南(核心篇)读书笔记(四)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76690961冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  8. Java多线程编程实战指南(核心篇)读书笔记(三)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76686044冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  9. Java多线程之锁优化策略

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6561264.html  锁的优化策略 编码过程中可采取的锁优化的思路有以下几种: 1:减少锁持有时间 例如:对 ...

随机推荐

  1. Linux Mint---ATI显卡驱动安装篇

    显卡驱动可谓是至关重要,当时折腾debian驱动的时候可是弄了好几天才搞定的,现在却非常容易就是装上, 详见这篇博客:http://www.yyearth.com/article/14-03/amd1 ...

  2. Linux进程管理与调度-之-目录导航【转】

    转自:http://blog.csdn.net/gatieme/article/details/51456569 版权声明:本文为博主原创文章 && 转载请著名出处 @ http:// ...

  3. usb驱动---What is the difference between /dev/ttyUSB and /dev/ttyACM【转】

    转自:http://blog.csdn.net/ppp2006/article/details/25654733 https://www.rfc1149.net/blog/2013/03/05/wha ...

  4. Linux中断(interrupt)子系统之五:软件中断(softIRQ)【转】

    转自:http://blog.csdn.net/droidphone/article/details/7518428 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 软件中 ...

  5. Kubernetes-服务发布

    #发布服务有三种方式,第一种把端口映射到所有节点比较适合发布一些tcp/udp的服务对于应用层像http的会导致无法获取到原始客户端IP,第二种需要用到云服务才行,第三种是ingress http服务 ...

  6. how to configure team on liunx(RHEL7.x/Centos7.x)

    #install team sofeware yum install teamd -y #check team configuration nmcli con show #Next we create ...

  7. bottle框架学习(1):命令行

    在最初的一段代码,内容如下: if __name__ == '__main__': from optparse import OptionParser _cmd_parser = OptionPars ...

  8. HDU 2955 【01背包/小数/概率DP】

    Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  9. UVA Live 6437 Power Plant 最小生成树

    题意: 有许多油井和村庄什么的,让你使得这些村庄能连通一个油井就好了.第一行给你一个数字T代表有T组测试数据,第二行有 M , N , K ,M代表包括油井在内的村庄数,N 代表有N个 两两连通的地方 ...

  10. Fiddler在fiddler option设置还是抓不了HTTPS包解决办法

    1:请在“运行”,即下面这个地方输入certmgr.msc并回车,打开证书管理. 打开后,请点击操作--查找证书,如下所示: 然后输入“fiddler”查找所有相关证书,如下所示: 可以看到,我们找到 ...