• 锁偏向
     是一种加锁操作的优化手段,他的核心思想是:如果一个线程获得了锁,那么就进入偏向模式,当这个线程再次请求锁时,无须在做任何同步操作,因此在几乎没有锁竞争的场合,偏向锁是比较好的优化效果,因为连续多次极有可能是同一个线程请求同一个相同的锁,对于锁竞争比较激烈的场合,其效果不佳,因为竞争激烈的场合,最有可能的情况是每次都是不同的线程来请求相同的锁,这样偏向模式就会失效,使用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. SQL的主键和外键的作用

    SQL的主键和外键约束 转载自:http://www.cnblogs.com/ywb-lv/archive/2012/03/12/2391860.html感谢原文作者的总结 SQL的主键和外键的作用: ...

  2. HDU3068 最长回文

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  3. vue 项目 webstrom IDE格式化代码规则遵循eslint设置

    首先vue-cli生成了一个项目,开启了eslint的检测, 但是根据webstorm的快捷格式化代码 ctrl+alt+L会造成eslint报错. 解决办法一: 编辑器打开文件 首先,在编辑器里面要 ...

  4. [LeetCode] Search for a Range 二分搜索

    Given a sorted array of integers, find the starting and ending position of a given target value. You ...

  5. Passing address of non-local object to _autoreleasing parameter for write-back

    http://233.io/article/1031248.html Passing address of non-local object to __autoreleasing parameter ...

  6. 【原创】Oracle 11g R2 Client安装配置说明(多图详解)

    1. 准备工作 安装Oracle11gR2client的时候,如果刚从网上下载的Oracle client,可能无法再2008 R2或者2012 R2的服务器上面运行. 报错:[INS-13001]环 ...

  7. MSSQL—列记录合并成一行

    在项目开发中,有时会碰到将列记录合并为一行的情况,例如根据地区将人员姓名合并,或根据拼音首字母合并城市等,下面就以根据地区将人员姓名合并为例,详细讲一下合并的方法. 首先,先建一个表,并添加一些数据, ...

  8. 【转】2017PHP程序员的进阶之路

    2017PHP程序员的进阶之路 又是一年毕业季,可能会有好多毕业生即将进入开发这个圈子,踏上码农这个不归路.根据这些年在开发圈子总结的LNMP程序猿发展轨迹,结合个人经验体会,总结出很多程序员对未来的 ...

  9. HDU 1846 Brave Game【巴什博弈裸题】

    Brave Game Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  10. unity3d 场景配置文件生成代码

    using UnityEngine; using UnityEditor; using System.IO; using System; using System.Text; using System ...