juc并发编程--jit即时编译器之锁清除(代码片段)

Z&&Y Z&&Y     2022-12-27     507

关键词:

1.1 锁消除

导入相关依赖:

因为 JMH 是 JDK9 自带的,如果是 JDK9 之前的版本需要加入如下依赖

        <dependency>
            <groupId>org.openjdk.jmh</groupId>
            <artifactId>jmh-core</artifactId>
            <version>1.23</version>
        </dependency>
        <dependency>
            <groupId>org.openjdk.jmh</groupId>
            <artifactId>jmh-generator-annprocess</artifactId>
            <version>1.23</version>
        </dependency>

示例代码:

package com.tian;
import org.openjdk.jmh.annotations.*;

import java.util.concurrent.TimeUnit;

@Fork(1)
// 统计程序运行的平均时间
@BenchmarkMode(Mode.AverageTime)
// 以纳秒为单位
@OutputTimeUnit(TimeUnit.NANOSECONDS)
// 预热3次 让代码的运行环境得到优化 得到最真实的运行时间
@Warmup(iterations = 3)
// 测试5轮
@Measurement(iterations = 5)
public class MyBenchmark 
    static int x = 0;

    @Benchmark
    public void a() throws Exception 
        x++;
    

    @Benchmark
    // JIT即时编译器
    public void b() throws Exception 
        Object o = new Object();
        synchronized (o) 
            x++;
        
    

打成jar包:

运行jar包:

在target目录打开控制台输入:
java -jar jar包名

运行结果:

为什么一个加了锁一个没有加锁运行效率还是差不多呢?

Java是一个解释+编译的执行方式,对Java中的代码是解释执行,但是对于对于反复调用的代码会使用JIT即时编译器进行进一步的优化。优化的其中七个手段就是看局部变量可不可以优化,这里发现b()方法中的o变量没有逃离方法的作用范围,也没有暴露引用,所以o变量不可能被共享,所以对o加锁没有任何意义,所以JIT即时编译器会把这里的synchronized关键字直接优化掉,真正这个代码执行时其实是没有synchronized的,所以上面代码的执行效率是差不多的

关闭锁消除运行刚刚的jar包:

在target目录打开控制台输入:
java -XX:-EliminateLocks -jar jar包名



CUDA 表达式模板和即时编译 (JIT)

...论文实现了一个基于表达式模板的库J.M.Cohen,“使用C++元编程处理设备阵列”,GPU计算宝石-Jade版它似乎工作得相当好。如果我比较矩阵元素运算的计 查看详情

浅析jit即时编译技术

...。必要时,也会通过逆优化从即时编译回到解释执行,如编译器遇到罕见陷阱的情况。  在Java虚拟机规范中,并未要求虚拟机必须实现即时编译,但即时编译在主流的虚拟机中都有实现,后文所 查看详情

jvm虚拟机aot和jit即时编译(代码片段)

文章目录JVM虚拟机AOT和JIT即时编译1、AOT2、JITJVM虚拟机AOT和JIT即时编译1、AOTAOT是AheadOfTime,运行前编译与JIT编译对比JIT吞吐量高,有运行时性能加成,可以跑得更快,并可以做到动态生成代码等,但是相对启动... 查看详情

juc并发编程--线程的五种状态(操作系统层面)和六种状态(javaapi层面)(代码片段)

1.五种状态(操作系统层面)这是从操作系统层面来描述的【初始状态】仅是在语言层面创建了线程对象,还未与操作系统线程关联【可运行状态】(就绪状态)指该线程已经被创建(与操作系统线程关联),... 查看详情

jit即时编译

...电子邮件发送本页面JIT是justintime的缩写,也就是即时编译编译器。使用即时编译器技术,能够加速Java程序的执行速度。下面,就对该编译器技术做个简单的讲解。首先,我们大家都知道,通常通过javac将程序源代... 查看详情

并发编程之java内存模型

1、基本概念程序:代码,完成某一任务,代码序列(静态的概念)进程:程序在某些数据上的一次运行(动态概念)线程:一个进程可能包含一个或多个线程(占有资源的独立单元)2、JVM与线程JVM虚拟机在类被调用的时候启动先... 查看详情

jit即时编译

...文件   class文件有2种方式执行:解释执行、JIT即时编译后执行    通常情况下默认解释器边解释边运行,但对于一些热点代码会首先编译为机器码,缓存起来,后续执行执行缓存的机器码即可,提升执行... 查看详情

juc高并发编程(代码片段)

...1.3.线程的状态1.3.1线程状态枚举类1.3.2.wait/sleep的区别1.4.并发与并行1.4.1.串行模式1.4.2.并行模式1.4.3.并发1.4.4.小结(重点)1.5.管程1.6.用户线程和守护线程2.Lock接口2.1.Synchronized2.1.1.Synchronized关键字回顾2.1.2.售票案例2.2.什 查看详情

juc高并发编程(代码片段)

...1.3.线程的状态1.3.1线程状态枚举类1.3.2.wait/sleep的区别1.4.并发与并行1.4.1.串行模式1.4.2.并行模式1.4.3.并发1.4.4.小结(重点)1.5.管程1.6.用户线程和守护线程2.Lock接口2.1.Synchronized2.1.1.Synchronized关键字回顾2.1.2.售票案例2.2.什 查看详情

java虚拟机即时编译器技术jit

...是与加载器操作相关的,被称为“即时”(Just-In-Time,JIT)编译器的技术。这种技术可以把程序全部或部分翻译成本地机器码(这本来是JVM的工作),程序运行速度因此得以提升。当需要装载某个类时,编译器会先找到其.class文件,... 查看详情

java即时编译jit

...可执行的代码(原生型指令码)JITCompiler(Just-in-timeCompiler)即时编译最早的Java建置方案是由一套转译程式(interpreter),将每个Java指令都转译成对等的微处理器指令,并根据转译后的指令先后次序依序执行,由于一个Java指令可能... 查看详情

jit即时编译(史上最全)(代码片段)

...后面,水不知道有多深。首先,考察了大家对JVM即时编译组件的 查看详情

并发编程-阻塞队列&juc常用工具(代码片段)

并发编程-阻塞队列&JUC常用工具本章主要和大家聊聊之前的阻塞队列,并且聊聊他如何使用,以及JUC中常用的一些工具,例如【CountDownLatch】、【Semaphore】、【CyclicBarrier】这些都是控制线程的一些工具,我们会聊聊他们如何使... 查看详情

juc并发编程学习笔记下(尚硅谷)(代码片段)

5多线程锁5.1锁的八个问题演示classPhonepublicstaticsynchronizedvoidsendSMS()throwsException//停留4秒TimeUnit.SECONDS.sleep(4);System.out.println("------sendSMS");publicsynchronizedvoidsendEmail()throwsExce 查看详情

juc并发编程--aqs(代码片段)

转自: https://www.jianshu.com/p/d8eeb31bee5c 前言在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock、ReadWriteLock(实现类ReentrantReadWriteLock),内部实现都依赖AbstractQueuedSynchronizer类,接下去让我们看看Do 查看详情

一文总结juc并发编程(代码片段)

文章目录一、JUC并发编程二、协调锁1.Synchronized2.Synchronized锁下线程通信3.Lock锁4.Lock锁实例-ReentrantLock5.读写锁-ReadWriteLock三、CAS&原子类1.CAS2.原子类2.1基础原子类2.2数组类型原子类2.3引用型原子类四、线程1.Callable和Future2.线程... 查看详情

javajava即时编译(jit)器原理解析及实践

1.概述转载:Java即时编译(JIT)器原理解析及实践一、导读常见的编译型语言如C++,通常会把代码直接编译成CPU所能理解的机器码来运行。而Java为了实现“一次编译,处处运行”的特性,把编译的过... 查看详情

juc并发编程--juc介绍&线程/进程&并发/并行&java代码查看cpu的核数(代码片段)

1.JUC介绍JUC就是java.util.concurrent工具包的简称。这是一个处理线程的工具包。2.线程/进程进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系... 查看详情