`

【Java核心-进阶】synchronized 底层实现

    博客分类:
  • Java
 
阅读更多

synchronized 底层实现

  • synchronized 代码块的底层是通过一对指令 monitorenter 和 monitorexit 配合实现。
  • Java 6之前,Monitor依靠操作系统内部的互斥锁实现。这会涉及用户态和内核态的转换,所以是重量级操作。
  • 新的 JDK 提供了三种不同的实现:
    • 偏斜锁(Biased Locking):
      • JVM 利用 CAS 操作(compare and swap)标记同步对象(Mark Word部分)当前所偏向线程的ID,不涉及互斥,以此降低无竞争时的开销。
      • 这个设计基于假设:大部分对象在其生命周期中只会被一个线程锁定。
      • 可在 JVM 启动时指定参数 “-XX:+UseBiasedLocking” 启用偏斜锁;“-XX:-UseBiasedLocking” 禁用偏斜锁
    • 轻量级锁
      • 轻量级锁的获取也是通过 CAS 操作标记同步对象的Mark Word部分来获取
    • 重量级锁

 

锁的升级、降级

JVM 会根据检测到的竞争状况的不同,优化 synchronized 的运行机制,自动切换到合适的锁实现。

锁的升级

  • 没有竞争时,默认使用偏斜锁
    • 前提是已启用偏斜锁。如果偏斜锁被禁用,将尝试获取轻量级锁
  • 当某线程试图锁定已偏斜到其它线程的对象时,JVM 会撤销偏斜锁,并切换为轻量级锁
    • 注:撤销偏斜锁操作是比较重的行为
  • 如果获取轻量级锁失败,则会升级为重量级锁

锁的降级

当 JVM 进入安全点时,会检查是否有闲置的 Monitor;如果有,会尝试对其进行降级

  • 安全点:HotSpot JVM 处于 Stop-the-World 暂停(传说中的 STW)

 

部分源码

if (UseBiasedLocking) {
    // Retry fast entry if bias is revoked to avoid unnecessary inflation
    ObjectSynchronizer::fast_enter(h_obj, lock, true, CHECK);
} else {
    ObjectSynchronizer::slow_enter(h_obj, lock, CHECK);
}
 
void ObjectSynchronizer::fast_enter(Handle obj, BasicLock* lock, bool attempt_rebias, TRAPS) {
    if (UseBiasedLocking) {
        if (!SafepointSynchronize::is_at_safepoint()) {
            BiasedLocking::Condition cond = BiasedLocking::revoke_and_rebias(obj, attempt_rebias, THREAD);
            if (cond == BiasedLocking::BIAS_REVOKED_AND_REBIASED) {
                return;
            }
        } else {
            assert(!attempt_rebias, "can not rebias toward VM thread");
            BiasedLocking::revoke_at_safepoint(obj);
        }
        assert(!obj->mark()->has_bias_pattern(), "biases should be revoked by now");
    }

    slow_enter (obj, lock, THREAD) ;
}
 

注:代码中的“Atomic::cmpxchg_ptr”就是传说中的 CAS(compare and swap)

void ObjectSynchronizer::slow_enter(Handle obj, BasicLock* lock, TRAPS) {
    markOop mark = obj->mark();
    assert(!mark->has_bias_pattern(), "should not see bias pattern here");

    if (mark->is_neutral()) {
        // Anticipate successful CAS -- the ST of the displaced mark must
        // be visible <= the ST performed by the CAS.
        lock->set_displaced_header(mark);
        if (mark == (markOop) Atomic::cmpxchg_ptr(lock, obj()->mark_addr(), mark)) {
            TEVENT (slow_enter: release stacklock) ;
            return ;
        }
    // Fall through to inflate() ...
    } else if (mark->has_locker() && THREAD->is_lock_owned((address)mark->locker())) {
        assert(lock != mark->locker(), "must not re-lock the same lock");
        assert(lock != (BasicLock*)obj->mark(), "don't relock with same BasicLock");
        lock->set_displaced_header(NULL);
        return;
    }

    #if 0
    // The following optimization isn't particularly useful.
    if (mark->has_monitor() && mark->monitor()->is_entered(THREAD)) {
        lock->set_displaced_header (NULL) ;
        return ;
    }
    #endif

    // The object header will never be displaced to this lock,
    // so it does not matter what the value is, except that it
    // must be non-zero to avoid looking like a re-entrant lock,
    // and must not look locked either.
    lock->set_displaced_header(markOopDesc::unused_mark());

    // 锁膨胀
    ObjectSynchronizer::inflate(THREAD, obj())->enter(THREAD);
}
 
分享到:
评论

相关推荐

    Java语言程序设计-进阶篇(原书第8版)

    在Java的世界里,进阶学习主要包括以下几个核心领域: 1. **多线程编程**:Java是并发编程的强大平台,书中会详细介绍Thread类和Runnable接口,如何创建并管理线程,以及如何使用同步机制(如synchronized关键字、...

    java多线程进阶

    Java多线程是Java编程中的核心概念,尤其对于高级开发者来说,掌握多线程的深入理解和应用至关重要。这本书“java多线程进阶”显然旨在帮助读者深化这方面的理解,打通编程中的“任督二脉”,使开发者能够更加熟练地...

    Java进阶.zip

    线程同步、锁机制(如synchronized关键字、ReentrantLock等)、并发集合(如ConcurrentHashMap)以及Executor框架都是Java进阶学习的重点。 3. **反射与动态代理**: 反射机制使得Java在运行时可以检查类的信息,...

    Java语言程序设计进阶篇答案与代码

    Java集合框架是另一个重要的学习点,包括ArrayList、LinkedList、HashSet、HashMap等数据结构的使用场景、性能特点以及它们的底层实现。同时,进阶篇还会讲解如何使用泛型来增强代码的类型安全性,以及如何利用...

    JAVA核心知识点整理.zip

    "JAVA核心知识点整理.zip"这个压缩包文件包含了对Java进阶学习的重要知识点的详细概述,主要集中在PDF文档"JAVA核心知识点整理.pdf"中。以下是这份资料可能涵盖的主要内容: 1. **Java基础**:首先,你会学到Java的...

    Java进阶路线

    ### Java进阶路线详解 #### 一、Java基础 **1. 传值与传引用** 在Java中,基本类型(如int、char等)的传递是按值传递的,而对象类型的传递则是按引用传递的。理解这一点对于正确处理变量和对象之间的交互至关...

    Thinking in Java(第四版) java的进阶 中文版 pdf

    总的来说,《Thinking in Java》第四版是一本深度与广度兼备的Java进阶指南,无论你是希望深入理解Java的底层机制,还是寻求提升编程思维,这本书都能提供丰富的知识和实战指导。通过阅读和实践书中的代码示例,你将...

    java面试进阶解析笔记

    JVM在各个操作系统上都有对应的实现,它负责解释执行字节码,使得Java程序无需关心底层操作系统细节。 3. **简单性**: 相比C++,Java简化了许多复杂特性,例如不支持指针操作,这减少了因误用指针导致的错误。...

    java核心技术源代码

    每个主题都会深入到源码层面,帮助读者理解Java的底层实现,这对于提升编程技能和优化代码性能至关重要。通过深入学习这些内容,开发者可以更好地掌握Java语言,解决实际开发中的问题,提高代码质量和可维护性。

    Java语言程序设计进阶篇源代

    以下是一些重要的Java进阶知识点: 1. **多线程编程**:Java提供了丰富的多线程支持,包括Thread类和Runnable接口。理解线程的生命周期,同步机制如synchronized关键字、wait()、notify()和notifyAll()方法,以及...

    Java进阶知识点汇总.pdf

    ### Java进阶知识点详解 #### 第一章:基本语法 ##### 关键字 - **static**:用于定义...以上是对Java进阶知识点的详细解析,覆盖了基本语法、JDK源码分析等多个方面,有助于深入理解Java语言的核心机制及高级特性。

    Java提升,软件设计与开发,里面涵盖Java进阶的一些题目,还有各种规约,欢迎大家下载学习,互相交流

    - 题目通常是检验和提升编程能力的有效工具,这里的Java进阶题目可能包括算法挑战、数据结构问题、多线程同步、异常处理、内存管理等。通过解决这些题目,开发者可以深入理解Java的底层机制和高级特性,如反射、...

    java面试题---传智博客和其他

    理解它们的底层实现原理,如数组、链表、哈希表,以及它们的增删改查性能特点。 4. **多线程**:Java提供了丰富的多线程支持,包括Thread类、Runnable接口、synchronized关键字、volatile关键字、线程池等。理解...

    CC++Java笔试题--很多大公司的面试和笔试题目-珍贵

    "CC++Java笔试题--很多大公司的面试和笔试题目-珍贵"这个压缩包文件很可能包含了这些语言的基础知识、进阶概念以及实际问题的解题策略,这些都是求职者在准备面试和笔试时需要掌握的重点。 C语言是基础,它的特点是...

    Java高级资深核心知识全面解析.pdf

    Java作为一门广泛使用的编程语言,其高级资深核心知识涵盖了多个方面,包括基础概念、面向对象、容器、并发、JVM、网络、Linux、数据结构与算法、数据库、系统设计、工具使用以及面试技巧。这份全面解析旨在帮助即将...

    java多线程知识讲解及练习题

    线程可以彼此独立的执行,它是一种实现并发机制的有效手段,可以同时使用多个线程来完成不同的任务,并且一般用户在使用多线程时并不考虑底层处理的细节。程序是一段静态的代码,是软件执行的蓝本。进程是程序的一次...

    Java进阶教程解密JVM视频教程

    JVM 是 Java 程序的运行环境,学习 JVM,方能了解 Java 程序是如何被执行的,为进一步深入底层原理乃至程序性能调优打好基础。通过学习这门课程,你将掌握:1. JVM 内存结构的组成、各部分功能作用,学会利用内存...

    java高级理论-2

    Java高级理论是Java开发者进阶的...这份"java高级理论-2"的学习资料,包含的视频课程可能详细讲解了以上各个知识点,配合readme.txt的指南和www.heyjava.com网站提供的额外资源,将为你的Java进阶之路提供坚实的基础。

Global site tag (gtag.js) - Google Analytics