原文网址: http://ganzhi.blogspot.com/2008/02/javabiased.html#!/2008/02/javabiased.html
Java对象有一个两个Word的头部。其中,第一个word被称为mark
word,用来包含和垃圾收集、hash码的一些信息。第二个word用来指向对象的类。
第一个word的解释比较复杂,它包含两个bit用于指明mark
word的用途。
- 00: 表明这个对象处于lightweight locked的状态,其余的bit表示一个指向lock record的指针
- 01:
a) 001: 表明这个对象没有被锁住,其余的bit表示hash, age
b) 101: 表明这个对象可以被biasable的锁住,其余的bit标明biasable锁的threadID,
epoch和age.
- 10: 表明这个对象被锁住,并且有冲突发生,因而正在被复杂而低效的操作系统同步机制保护。剩余的bit是一个指向monitor的指针。
- 11: 这个对象被GC标明为垃圾
接下来,我们要谈谈对锁的优化。从文章《
HotSpot: A new
breed of virtual
machine
》中,我们可以看到早期的JVM花在线程同步上的开销是惊人的,线程同步的开销占到了执行时间的21%。而且这个开销不能简单的被JIT优化掉。因此,众多牛人提出了对锁的很多优化。
目前,JDK中最新的Biased锁是基于下面的观察:
- 轻量级锁处理中必定会用到的CAS(Compare and Set)操作相当慢,需要超过百个以上的cpu cycle
- 通常一个锁只被一个线程访问。而且可能是被同一个线程反复的访问,因此反复的CAS会很大程度上影响应用程序的性能
Biased锁将会尝试声明某个对象属于一个特定的线程,这个线程对对象的lock和unlock操作不需要进行CAS。如果其他线程想lock这个对象,那么它会把这个线程的biased的状态撤销,使其利用普通的锁机制。这样的话,在JDK中lock和unlock的流程就是这样的:
void lock(Object obj, Thread currentTr){
if( obj biased to currentTr)
return;
if( obj biased to other thread)
pause owner thread at safe point
change mark word and lock record to pretend that obj is locked by other thread with general lock.
else{
//fall to common lock
}
}
void unlock(Object obj, Thread currentTr){
if( obj biased to currentTr)
return .
else
fall to common lock
}
这个ppt讲得很通俗:
Lock
Reservation: Java Locks Can Mostly Do Without Atomic Operations
- 详细版本的论文可以看这里:www.research.ibm.com/trl/projects/jit/paper/p020-kawachiya.ps
- 优化Biased锁在下面的文章中有详细介绍:Eliminating
Synchronization-Related Atomic Operations with Biased Locking and Bulk
Rebiasing
相关推荐
在HotSpot中,锁有三种状态:无锁(Unlocked)、偏向锁(Biased Lock)和轻量级锁(Lightweight Lock)。当多个线程尝试访问同一对象时,锁会经历从无锁到偏向锁,再到轻量级锁,最后是重量级锁(Mutex)的升级过程...
当对象已经被偏向于一个线程时,其他线程尝试获取该对象锁时,需要撤销原有的偏向状态。撤销偏向状态的过程是挑战性的,需要协调撤销者(即持有偏向锁的线程)和被撤销者之间的同步。确保在撤销过程中,被撤销的线程...
JAVA 锁优化和膨胀过程 在 HotSpot 虚拟机中,锁优化和膨胀过程是两个重要的技术,旨在提高多线程之间共享数据的效率和处理竞争问题。这些技术包括自适应自旋(Adaptive Spinning)、锁删除(Lock Elimination)、...
- **偏向锁(Biased Locking):** 当一个对象被首次锁定时,JVM 使用偏向锁。在这种模式下,对象头被设置为指向当前持有锁的线程。如果之后没有其他线程试图获取该锁,那么该线程就可以无锁地访问对象。这减少了无...
* 对象头(Object Header):用于存储对象的元数据,例如对象的哈希码、锁信息等。 * 实例变量(Instance Variables):用于存储对象的实例变量。 * 填充数据(Padding):用于对齐对象在内存中的存储。 判断对象...
偏向锁的结构由 hashcode、age、biased_lock 和 thread_id 组成,其中biased_lock 表示是否为偏向锁,thread_id 表示线程的唯一标识符。 轻量级锁是Java锁机制的一种,用于解决线程之间的竞争问题。轻量级锁可以...
1. **偏斜锁(Biased Locking)**:默认情况下,当一个对象被创建时,JVM 会尝试让该对象偏向于第一个获得锁的线程。这意味着如果同一个线程多次请求同一对象的锁,它可以快速获取而不需进行任何同步操作。偏斜锁...
如果获取对象失败了,当前线程就要阻塞等待,直到对象锁被另外一个线程释放为止。 问题二:什么是锁?如何确定对象的锁? “锁”的本质其实是 monitorenter 和 monitorexit 字节码指令的一个 Reference 类型的参数...
1. **对象监视器锁(Object Monitor Lock)**:这是Java中实现synchronized关键字的基础,每个对象都有一个监视器锁。当线程试图访问一个由synchronized修饰的方法或代码块时,它必须首先获得该对象的监视器锁。如果...
在Java 6之后,为了提高性能,JVM引入了锁的升级和降级机制,使得synchronized在不同竞争情况下可以智能地选择合适的锁实现。 1. **偏斜锁(Biased Locking)**:在没有竞争的情况下,synchronized会尝试使用偏斜锁...
- **偏向锁(Biased Locking)**:当一个线程连续持有锁时,可以优化为偏向锁,减少锁状态转换的开销。 - **适应性⾃旋(Adaptive Spinning)**:根据系统负载动态调整自旋等待的时间,以平衡锁等待和上下文切换的...
以上内容涵盖了Java中高并发和多线程面试可能遇到的问题,包括Synchronized关键字的使用、原理、锁定对象、可重入性、JVM对锁的优化、Synchronized的公平性和非公平性、以及锁消除和锁粗化的概念。掌握这些知识点...
自Java 6和Java 7开始,JVM引入了多种策略来提升内部锁的效率,这些优化在server模式下运行时生效。以下是四种主要的优化方式: 1. **锁消除(Lock Elision)** 锁消除是指JIT(Just-In-Time)编译器通过逃逸分析...
在Java并发编程中,锁优化是一个重要的议题,旨在提高多线程环境下的系统性能和效率。本文主要围绕代码层面和JVM层面的锁优化技术展开讨论。 1. **避免死锁** 死锁是并发编程中的常见问题,四个必要条件包括: - ...
一个小的 Python 模块,用于计算rank-biased overlay,衡量参差不齐的、可能无限的排名列表之间的相似性,这些列表可能包含也可能不包含相同的项目(直到实际评估的深度或根本不包含)。参见 W. Webber、A. Moffat ...
在这一过程中,BCR(Biased Coin Randomization)方法通过模拟带有偏倚的硬币抛掷过程,对受试者进行治疗组的分配,从而增强了试验设计的灵活性和可控性。本文将深入探讨BCR算法在临床医药试验中的应用和实现,并...
invest-email-biased.csv
2. **类**(Classes):面向对象编程的核心,定义了具有相似属性和方法的对象模板。 3. **函数**(Functions):可重用的代码块,执行特定任务。 4. **接口**(Interfaces):库对外提供的API,允许用户通过调用特定...
Java垃圾回收和JVM中的STW机制是Java虚拟机中两个重要的机制,垃圾回收机制用于回收无用的对象以释放内存空间,而STW机制则是垃圾回收的必要步骤,用于暂停所有Java线程,以便垃圾回收器可以安全地回收内存。