锁消除和锁粗化案例分析

锁消除

  • 直接上代码
/**
* 描述: 锁粒度演示
* @author karl
* @create 2020-02-11 14:38
*/
public class MySynchronizedTest07 {
private Object object = new Object(); public void method() {
synchronized (object) {
System.out.println("hello world");
}
} }
  • 上述是一个简单的同步代码块的案例,在并发的情况下多个线程是共享MySynchronizedTest07 的成员变量 object所以才达到了锁的效果。
  • 我们再看下面一个案例代码:
package com.karl.concurrent.syn;

/**
* 描述: 锁粒度演示
*
* @author karl
* @create 2020-02-11pw 14:38
*/
public class MySynchronizedTest07 { public void method() {
Object object = new Object();
synchronized (object) {
System.out.println("hello world");
}
}
}
  • 上述代码我们可知将object变成了局部变量,在方法中,方法的的局部变量时线程独立的,并发的场景每个线程都有各自的object对象,这个时候的锁就无意义的。
  • 我们在编译上述代码的时候其实也发现了monitorenter和monitorexit,在字节码层面看上去还有有锁的获取和释放。
  • 这个时候JIT编译器可以在动态编译同步代码的时候,使用一种叫做逃逸分析的技术(后续学习jvm的时候会涉及到),来通过该技术判断程序中使用的锁对象是否只被一个线程所使用。而没有别的线程进行竞争。当这种情况的下,那么JIT编译器在编译(将字节码编程机器码)这个同步代码时就不会生成synchronized关键字所标识锁的申请和释放的机器码。从而消除锁的使用流程。这就是锁消除的原理和案例。

锁粗化

  • 直接上代码:

/**
* 描述: 锁粗化
*
* @author karl
* @create 2020-02-11 15:15
*/
public class MySynchronizedTest08 { private Object object = new Object(); public void method() {
synchronized (object) {
System.out.println("hello");
} synchronized (object) {
System.out.println("world");
} synchronized (object) {
System.out.println("!");
}
}
}
  • 代码很简单,在这里就不用做代码解释了
  • 我们直接看JIt编译器如何优化上述代码的。
  • JIT编译器在执行动态编译的时候。若发现前后相邻的synchronized块使用的是同一个锁对象,那么它就会把这几个synchronized块合并成一个较大的同步快,这样做的好处在于线程执行这些代码的时候,就无需频繁申请和释放锁了,从而达到申请与释放一次就可以执行全部的同步代码块,从而提高了性能。

总结

  • 由于JIT编译后的是机器码,不能实际的去操作相应的优化效果。所以先理解理论即可。

JIT对锁的优化- 锁消除和锁粗化案例分析的更多相关文章

  1. Java高并发程序设计学习笔记(九):锁的优化和注意事项

    转自:https://blog.csdn.net/dataiyangu/article/details/87612028 锁优化的思路和方法减少锁持有时间减小锁粒度锁分离锁粗化举个栗子举个栗子锁消除虚 ...

  2. jvm层面锁优化+一般锁的优化策略

    偏向锁: 首先了解对象头MARK指针(对象头标记,32位): 存储GC标记,对象年龄,对象Hash,锁信息(锁记录的指针,偏向锁线程的ID) 大部分情况是没有竞争的,所以可以通过偏向来提高性能 所谓的 ...

  3. JVM中锁优化,偏向锁、自旋锁、锁消除、锁膨胀

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt364 本文将简单介绍HotSpot虚拟机中用到的锁优化技术. 自旋锁 互斥同 ...

  4. synchronized原理及优化,(自旋锁,锁消除,锁粗化,偏向锁,轻量级锁)

    偏向锁:不占用CPU自旋锁:占用CPU.代码执行成本比较低且线程数少时,可以使用 .不经过OS.内核态,效率偏低 理解Java对象头与Monitor 在JVM中,对象在内存中的布局分为三块区域:对象头 ...

  5. Java线程安全与锁优化,锁消除,锁粗化,锁升级

    线程安全的定义 来自<Java高并发实战>"当多个线程访问一个对象的时候,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方法的时候进行任何 ...

  6. 重量级锁synchronized的优化----自旋锁、自适应自旋锁、锁消除、锁粗化

    synchronized是重量级锁,效率不高.但在jdk 1.6中对synchronize的实现进行了各种优化,使得它显得不是那么重了.jdk1.6对锁的实现引入了大量的优化,如自旋锁.自适应自旋锁. ...

  7. synchronized优化手段:锁膨胀、锁消除、锁粗化和自适应自旋锁...

    synchronized 在 JDK 1.5 时性能是比较低的,然而在后续的版本中经过各种优化迭代,它的性能也得到了前所未有的提升,上一篇中我们谈到了锁膨胀对 synchronized 性能的提升,然 ...

  8. 015-线程同步-synchronized几种加锁方式、Java对象头和Monitor、Mutex Lock、JDK1.6对synchronized锁的优化实现

    一.synchronized概述基本使用 为确保共享变量不会出现并发问题,通常会对修改共享变量的代码块用synchronized加锁,确保同一时刻只有一个线程在修改共享变量,从而避免并发问题. syn ...

  9. Java多线程--锁的优化

    Java多线程--锁的优化 提高锁的性能 减少锁的持有时间 一个线程如果持有锁太长时间,其他线程就必须等待相应的时间,如果有多个线程都在等待该资源,整体性能必然下降.所有有必要减少单个线程持有锁的时间 ...

随机推荐

  1. Windows10安装node.js

    1.下去官网下载node.js https://nodejs.org/zh-cn/download/ 2.安装,直接默认即可,安装路径也可以自己选择 3.设置环境变量 1.安装软件,若是-g,则是全局 ...

  2. Vue的响应式原理---(v-model中的双向绑定原理)

    Vue响应式原理 不要认为数据发生改变,界面跟着更新是理所当然. 具体代码实现:https://gitee.com/ahaMOMO/Vue-Responsive-Principle.git 看下图: ...

  3. python 中if和elif的区别

    如果程序中判断事件很多,全部用if的话,会遍历整个程序,用elif 程序运行时,只要if或后续某一个elif之一满足逻辑值为True,则程序执行完对应输出语句后自动结束该轮if-elif(即不会再去冗 ...

  4. Digital filter

    https://ww2.mathworks.cn/help/signal/examples/practical-introduction-to-digital-filter-design.html D ...

  5. 网页格式gbk转utf-8【python requests】

    resp = requests.get(url) resp.content 是str类型 resp.text是unicode类型 如果返回的中文使用gbk编码,需要转换成utf-8的时候: resp. ...

  6. Axure licensee key 8~9-转

    转:https://7rp.cn/34 AxureRP v9.0.0.3646 正式版 — 亲测可用 Licensee: jasmine Key: ATocOwMG75ijKpF0OEDSHQ3UZQ ...

  7. django-cors-headers

    django-cors-headers介绍 一个Django应用程序,向响应头中添加跨域资源共享(CORS)头.这允许从其他来源向Django应用程序发出浏览器内请求,当然也可以自定义中间件然后添加响 ...

  8. 【音乐欣赏】《Sunflower》 - Post Malone / Swae Lee

    曲名:Sunflower 作者:Post Malone.Swae Lee [00:02.29]Ayy, ayy, ayy, ayy (ooh) [00:09.49]Ooh, ooh, ooh, ohh ...

  9. 插入数据:insert,replace

    *insert高级用法* 1.语法:insert into tbname(字段列表) values 值列表; 1.1可以不将所有的字段都插入数据.如果说需要完成部分字段的插入,需要必须存在字段列表. ...

  10. spark-shell中往mysql数据库写数据报错

    今天在看spark方面的知识的时候,在spark-shell中往mysql写数据时报错,错误信息如下: ERROR Executor: Exception in task 0.0 in stage 4 ...