`
leonzhx
  • 浏览: 786830 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Zz Java对象头部的一些信息和Biased锁

    博客分类:
  • Java
 
阅读更多
原文网址: http://ganzhi.blogspot.com/2008/02/javabiased.html#!/2008/02/javabiased.html

Java对象有一个两个Word的头部。其中,第一个word被称为mark word,用来包含和垃圾收集、hash码的一些信息。第二个word用来指向对象的类。

第一个word的解释比较复杂,它包含两个bit用于指明mark word的用途。
  1. 00: 表明这个对象处于lightweight locked的状态,其余的bit表示一个指向lock record的指针
  2. 01:
    a)  001: 表明这个对象没有被锁住,其余的bit表示hash, age b)  101: 表明这个对象可以被biasable的锁住,其余的bit标明biasable锁的threadID, epoch和age.
  3. 10: 表明这个对象被锁住,并且有冲突发生,因而正在被复杂而低效的操作系统同步机制保护。剩余的bit是一个指向monitor的指针。
  4. 11: 这个对象被GC标明为垃圾
接下来,我们要谈谈对锁的优化。从文章《HotSpot: A new breed of virtual machine 》中,我们可以看到早期的JVM花在线程同步上的开销是惊人的,线程同步的开销占到了执行时间的21%。而且这个开销不能简单的被JIT优化掉。因此,众多牛人提出了对锁的很多优化。

目前,JDK中最新的Biased锁是基于下面的观察:
  1. 轻量级锁处理中必定会用到的CAS(Compare and Set)操作相当慢,需要超过百个以上的cpu cycle
  2. 通常一个锁只被一个线程访问。而且可能是被同一个线程反复的访问,因此反复的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
  1. 详细版本的论文可以看这里:www.research.ibm.com/trl/projects/jit/paper/p020-kawachiya.ps
  2. 优化Biased锁在下面的文章中有详细介绍:Eliminating Synchronization-Related Atomic Operations with Biased Locking and Bulk Rebiasing
分享到:
评论

相关推荐

    Biased Locking in HotSpot

    在HotSpot中,锁有三种状态:无锁(Unlocked)、偏向锁(Biased Lock)和轻量级锁(Lightweight Lock)。当多个线程尝试访问同一对象时,锁会经历从无锁到偏向锁,再到轻量级锁,最后是重量级锁(Mutex)的升级过程...

    Biased Locking in HotSpot - Dave - 2006.pdf

    当对象已经被偏向于一个线程时,其他线程尝试获取该对象锁时,需要撤销原有的偏向状态。撤销偏向状态的过程是挑战性的,需要协调撤销者(即持有偏向锁的线程)和被撤销者之间的同步。确保在撤销过程中,被撤销的线程...

    JAVA锁优化和膨胀过程.docx

    JAVA 锁优化和膨胀过程 在 HotSpot 虚拟机中,锁优化和膨胀过程是两个重要的技术,旨在提高多线程之间共享数据的效率和处理竞争问题。这些技术包括自适应自旋(Adaptive Spinning)、锁删除(Lock Elimination)、...

    顶尖的Java多线程、锁、内存模型面试题!.docx

    - **偏向锁(Biased Locking):** 当一个对象被首次锁定时,JVM 使用偏向锁。在这种模式下,对象头被设置为指向当前持有锁的线程。如果之后没有其他线程试图获取该锁,那么该线程就可以无锁地访问对象。这减少了无...

    深入理解Java虚拟机笔记(带目录).docx

    * 对象头(Object Header):用于存储对象的元数据,例如对象的哈希码、锁信息等。 * 实例变量(Instance Variables):用于存储对象的实例变量。 * 填充数据(Padding):用于对齐对象在内存中的存储。 判断对象...

    Java多线程锁机制相关原理实例解析

    偏向锁的结构由 hashcode、age、biased_lock 和 thread_id 组成,其中biased_lock 表示是否为偏向锁,thread_id 表示线程的唯一标识符。 轻量级锁是Java锁机制的一种,用于解决线程之间的竞争问题。轻量级锁可以...

    第16讲 synchronized底层如何实现?什么是锁的升级、降级?1

    1. **偏斜锁(Biased Locking)**:默认情况下,当一个对象被创建时,JVM 会尝试让该对象偏向于第一个获得锁的线程。这意味着如果同一个线程多次请求同一对象的锁,它可以快速获取而不需进行任何同步操作。偏斜锁...

    并发面试专题.docx

    如果获取对象失败了,当前线程就要阻塞等待,直到对象锁被另外一个线程释放为止。 问题二:什么是锁?如何确定对象的锁? “锁”的本质其实是 monitorenter 和 monitorexit 字节码指令的一个 Reference 类型的参数...

    Java分布式应用学习笔记03JVM对线程的资源同步和交互机制

    1. **对象监视器锁(Object Monitor Lock)**:这是Java中实现synchronized关键字的基础,每个对象都有一个监视器锁。当线程试图访问一个由synchronized修饰的方法或代码块时,它必须首先获得该对象的监视器锁。如果...

    第16讲synchronized底层如何实现?什么是锁...1

    在Java 6之后,为了提高性能,JVM引入了锁的升级和降级机制,使得synchronized在不同竞争情况下可以智能地选择合适的锁实现。 1. **偏斜锁(Biased Locking)**:在没有竞争的情况下,synchronized会尝试使用偏斜锁...

    java并发编程综合讲解

    - **偏向锁(Biased Locking)**:当一个线程连续持有锁时,可以优化为偏向锁,减少锁状态转换的开销。 - **适应性⾃旋(Adaptive Spinning)**:根据系统负载动态调整自旋等待的时间,以平衡锁等待和上下文切换的...

    高并发多线程面试专题及答案(上).pdf

    以上内容涵盖了Java中高并发和多线程面试可能遇到的问题,包括Synchronized关键字的使用、原理、锁定对象、可重入性、JVM对锁的优化、Synchronized的公平性和非公平性、以及锁消除和锁粗化的概念。掌握这些知识点...

    浅谈Java虚拟机对内部锁的四种优化方式

    自Java 6和Java 7开始,JVM引入了多种策略来提升内部锁的效率,这些优化在server模式下运行时生效。以下是四种主要的优化方式: 1. **锁消除(Lock Elision)** 锁消除是指JIT(Just-In-Time)编译器通过逃逸分析...

    锁优化技术分享.pdf

    在Java并发编程中,锁优化是一个重要的议题,旨在提高多线程环境下的系统性能和效率。本文主要围绕代码层面和JVM层面的锁优化技术展开讨论。 1. **避免死锁** 死锁是并发编程中的常见问题,四个必要条件包括: - ...

    bcr.rar_BCR_Biased

    标题中的“bcr.rar_BCR_Biased”可能是一个包含BCR算法实现和相关资料的压缩文件。 "bcr.m"很可能是一个MATLAB脚本,用于实现BCR算法。MATLAB是一种广泛用于数值计算和数据分析的编程环境,特别适合处理统计和随机...

    秩偏重叠列表相似性度量 的 Python 实现_python_代码_下载

    一个小的 Python 模块,用于计算rank-biased overlay,衡量参差不齐的、可能无限的排名列表之间的相似性,这些列表可能包含也可能不包含相同的项目(直到实际评估的深度或根本不包含)。参见 W. Webber、A. Moffat ...

    invest-email-biased.csv

    invest-email-biased.csv

    Python库 | coupled_biased_random_walks-1.0.0.tar.gz

    2. **类**(Classes):面向对象编程的核心,定义了具有相似属性和方法的对象模板。 3. **函数**(Functions):可重用的代码块,执行特定任务。 4. **接口**(Interfaces):库对外提供的API,允许用户通过调用特定...

    快速理解Java垃圾回收和jvm中的stw

    Java垃圾回收和JVM中的STW机制是Java虚拟机中两个重要的机制,垃圾回收机制用于回收无用的对象以释放内存空间,而STW机制则是垃圾回收的必要步骤,用于暂停所有Java线程,以便垃圾回收器可以安全地回收内存。

Global site tag (gtag.js) - Google Analytics