Java教程:JVM对Java的原生锁做了哪些优化?

 JVM对Java的原生锁(即synchronized关键字)做了许多优化,其中包括:

1.偏向锁(Biased Locking)

  当一个线程获取锁后,JVM会将锁的对象头标记为偏向锁。此时,该线程可以无需竞争地获取该锁。这种情况下,锁的获取和释放不需要额外的开销,因为偏向锁会记录线程ID,使得在该线程持有锁期间,其他线程无法获取该锁。只有在其他线程尝试获取锁时,才会升级为轻量级锁。

2.轻量级锁(Lightweight Locking)

  当多个线程争夺锁时,JVM会将锁标记为轻量级锁。此时,JVM会在锁对象的对象头中记录指向线程栈中锁记录的指针,以及用于保存原始对象的指针。这样,当一个线程尝试获取该锁时,JVM会将该线程的栈帧中的锁记录与锁对象头中的指针进行比较。如果相同,则表示该线程已经获得了该锁;否则,JVM会使用CAS操作尝试将锁对象头中的指针指向当前线程的锁记录。如果CAS操作成功,表示当前线程成功获得了锁。否则,表示有其他线程争夺该锁,此时JVM会将锁升级为重量级锁。

3.重量级锁(Heavyweight Locking)

  当多个线程争夺锁时,如果无法获得锁,则会升级为重量级锁。此时,JVM会使用操作系统的互斥量实现锁。重量级锁的开销非常大,因为需要进行用户态与内核态之间的上下文切换。

  下面是一个简单的代码演示,展示了偏向锁、轻量级锁和重量级锁的使用情况。

public class SynchronizedDemo {    private int count = 0;    public synchronized void increment() {        count++;    }    public static void main(String[] args) {        SynchronizedDemo demo = new SynchronizedDemo();        for (int i = 0; i < 100000; i++) {            demo.increment();        }        System.out.println(demo.count);    }}

  在这个示例中,我们使用synchronized关键字来对increment()方法进行同步。由于该方法是实例方法,因此锁对象是该实例对象。当多个线程同时访问该方法时,JVM会根据锁的状态来选择使用偏向锁、轻量级锁或重量级锁。具体的选择过程是由JVM内部的锁升级算法来决定的,这里不再详细展开。

本文来自投稿,不代表重蔚自留地立场,如若转载,请注明出处https://www.cwhello.com/261714.html

如有侵犯您的合法权益请发邮件951076433@qq.com联系删除

(0)
黑马程序员黑马程序员订阅用户
上一篇 2023年4月26日 23:15
下一篇 2023年4月26日 23:15

相关推荐

  • Java程序员饱和了?

    随着软件开发行业的蓬勃发展,程序员的需求量日益增长,其中以Java开发尤其显著,越来越多人选择去学习Java编程语言,找一份好工作。然而,随着Java的火爆,质疑的声音也越来越大。前几日播妞看到有人说:现在Java…

    2023年5月13日
    01
  • 经验分享java html转markdown。

    在Java中,将HTML转换为PDF的过程可以通过多种方式实现,其中一种常见的方式是使用iText库和Html2Pdf库,以下是详细的步骤: (图片来源网络,侵删) 1、你需要在你的项目中添加iText和Html2Pdf的依赖,如果你使用…

    2024年6月24日
    05
  • 小编分享java xpath解析html。

    在Java中,我们可以使用Jsoup库来解析HTML字符串,Jsoup是一个用于处理真实世界HTML的Java库,它提供了一个非常方便的API,用于提取和操作数据,使用DOM,CSS和jquerylike方法。 (图片来源网络,侵删) 以下是如何…

    2024年6月24日
    04
  • java教程之高性能并发计数器之巅峰对决

    并发计数器各个方案介绍方案概述jdk5提供的原子更新长整型类 AtomicLongsynchronizedjdk8提供的 LongAdder 【单机推荐】Redisson分布式累加器【分布式推荐】方案介绍jdk5提供的原子更新长整型类 AtomicLong在JDK1.5…

    2023年5月12日 编程分享
    010
  • 学习Java需要掌握哪些技能?

    想要找到Java工程师的工作,必须具备Java岗位要求的相关技能,应该有夯实的Java基础知识,熟练掌握、JavaSE开发、JavaWEB与数据库高级编程、企业级框架、大型企业级项目实战等相关的开发技能。01 Java基础知识Java…

    2023年5月13日
    03
  • Java语言具有哪些特点?

      Java语言是一门优秀的编程语言,它之所以应用广泛,受到大众的欢迎。是因为它有众多突出的特点,其中最主要的特点有以下几个。  1.简单性  Java语言是一种相对简单的编程语言,它通过提供最基本的方法完成指…

    2023年5月12日
    08
  • Java中的SSM框架详解

    Java SSM框架即指Spring+SpringMVC+MyBatis的简称,框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容),常作为数据源较简单的web项目的框架。相比于之前的SSH(Spring+Struts+Hibernat…

    2023年5月15日
    015
  • Java教程之教你更优雅的写法处理null检查

    回顾以前对null的处理方式public class OptionalTest { public static void main(String[] args) { test01("小黑"); test01(null); } public static void test01(String userName) { if (userName != nul…

    2023年5月12日
    011

联系我们

QQ:951076433

在线咨询:点击这里给我发消息邮件:951076433@qq.com工作时间:周一至周五,9:30-18:30,节假日休息