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的世界里,进阶学习主要包括以下几个核心领域: 1. **多线程编程**:Java是并发编程的强大平台,书中会详细介绍Thread类和Runnable接口,如何创建并管理线程,以及如何使用同步机制(如synchronized关键字、...
Java多线程是Java编程中的核心概念,尤其对于高级开发者来说,掌握多线程的深入理解和应用至关重要。这本书“java多线程进阶”显然旨在帮助读者深化这方面的理解,打通编程中的“任督二脉”,使开发者能够更加熟练地...
线程同步、锁机制(如synchronized关键字、ReentrantLock等)、并发集合(如ConcurrentHashMap)以及Executor框架都是Java进阶学习的重点。 3. **反射与动态代理**: 反射机制使得Java在运行时可以检查类的信息,...
Java集合框架是另一个重要的学习点,包括ArrayList、LinkedList、HashSet、HashMap等数据结构的使用场景、性能特点以及它们的底层实现。同时,进阶篇还会讲解如何使用泛型来增强代码的类型安全性,以及如何利用...
"JAVA核心知识点整理.zip"这个压缩包文件包含了对Java进阶学习的重要知识点的详细概述,主要集中在PDF文档"JAVA核心知识点整理.pdf"中。以下是这份资料可能涵盖的主要内容: 1. **Java基础**:首先,你会学到Java的...
### Java进阶路线详解 #### 一、Java基础 **1. 传值与传引用** 在Java中,基本类型(如int、char等)的传递是按值传递的,而对象类型的传递则是按引用传递的。理解这一点对于正确处理变量和对象之间的交互至关...
总的来说,《Thinking in Java》第四版是一本深度与广度兼备的Java进阶指南,无论你是希望深入理解Java的底层机制,还是寻求提升编程思维,这本书都能提供丰富的知识和实战指导。通过阅读和实践书中的代码示例,你将...
JVM在各个操作系统上都有对应的实现,它负责解释执行字节码,使得Java程序无需关心底层操作系统细节。 3. **简单性**: 相比C++,Java简化了许多复杂特性,例如不支持指针操作,这减少了因误用指针导致的错误。...
每个主题都会深入到源码层面,帮助读者理解Java的底层实现,这对于提升编程技能和优化代码性能至关重要。通过深入学习这些内容,开发者可以更好地掌握Java语言,解决实际开发中的问题,提高代码质量和可维护性。
以下是一些重要的Java进阶知识点: 1. **多线程编程**:Java提供了丰富的多线程支持,包括Thread类和Runnable接口。理解线程的生命周期,同步机制如synchronized关键字、wait()、notify()和notifyAll()方法,以及...
### Java进阶知识点详解 #### 第一章:基本语法 ##### 关键字 - **static**:用于定义...以上是对Java进阶知识点的详细解析,覆盖了基本语法、JDK源码分析等多个方面,有助于深入理解Java语言的核心机制及高级特性。
- 题目通常是检验和提升编程能力的有效工具,这里的Java进阶题目可能包括算法挑战、数据结构问题、多线程同步、异常处理、内存管理等。通过解决这些题目,开发者可以深入理解Java的底层机制和高级特性,如反射、...
理解它们的底层实现原理,如数组、链表、哈希表,以及它们的增删改查性能特点。 4. **多线程**:Java提供了丰富的多线程支持,包括Thread类、Runnable接口、synchronized关键字、volatile关键字、线程池等。理解...
"CC++Java笔试题--很多大公司的面试和笔试题目-珍贵"这个压缩包文件很可能包含了这些语言的基础知识、进阶概念以及实际问题的解题策略,这些都是求职者在准备面试和笔试时需要掌握的重点。 C语言是基础,它的特点是...
Java作为一门广泛使用的编程语言,其高级资深核心知识涵盖了多个方面,包括基础概念、面向对象、容器、并发、JVM、网络、Linux、数据结构与算法、数据库、系统设计、工具使用以及面试技巧。这份全面解析旨在帮助即将...
线程可以彼此独立的执行,它是一种实现并发机制的有效手段,可以同时使用多个线程来完成不同的任务,并且一般用户在使用多线程时并不考虑底层处理的细节。程序是一段静态的代码,是软件执行的蓝本。进程是程序的一次...
JVM 是 Java 程序的运行环境,学习 JVM,方能了解 Java 程序是如何被执行的,为进一步深入底层原理乃至程序性能调优打好基础。通过学习这门课程,你将掌握:1. JVM 内存结构的组成、各部分功能作用,学会利用内存...
Java高级理论是Java开发者进阶的...这份"java高级理论-2"的学习资料,包含的视频课程可能详细讲解了以上各个知识点,配合readme.txt的指南和www.heyjava.com网站提供的额外资源,将为你的Java进阶之路提供坚实的基础。