轻量级锁(Lightweight Lock)是JDK 6 时加人的新型锁机制,它名字中的“轻量级”是相对于使用操作系统互斥量来实现的传统锁而言的,因此传统的锁机制就被称为“重量级”锁。不过,需要强调一点,轻量级锁并不是用来代替重量级锁的,它设计的初衷是在没有多线程竞争的前提下,减少传统的重量级锁使用操作系统互斥量产生的性能...
轻量级锁的目标是,减少无实际竞争情况下,使用重量级锁产生的性能消耗,包括系统调用引起的内核态与用户态切换、线程阻塞造成的线程切换等。 1.1 轻量级锁获取过程 当线程执行代码进入同步块时,若Mark Word锁标识为无锁状态(是否为偏向锁为0,锁标志位为01),虚拟机会在当前线程的栈帧中建立一个名为锁记录(Lock Record...
当轻量级锁(没有竞争,就自己这个线程)+ 锁重入时,每次都需要生成锁记录,并尝试CAS替换对象头的MarkWord操作。 JDK6引入偏向锁做进一步优化: 只有第一次加锁时,不需要生成锁记录,将线程ID设置到锁对象的MarkWord中;之后锁重入时,检查MarkWord是否是自己的线程ID,只要不发生竞争,则可以一直使用偏向锁。 优点:避免了...
synchronized是一直在java的加锁中扮演重要角色,都说它是重量级锁,不过这是JDK5的版本的老黄历了,JDK6以后做了了优化,根据不同情况分别使用向锁、轻量级锁和重量级锁了。 JVM通过Monoitor来实现的synchronized的加锁,monitorenter在编译后会加到同步代码块的开始位置,monitorexit加到结束和异常的位置。 让用javap反编译...
轻量级锁是JDK1.6之中加入的新型锁机制,它名字中的“轻量级”是相对于使用操作系统互斥量来实现的传统锁而言的,因此传统的锁机制就称为“重量级”锁。首先需要强调一点的是,轻量级锁并不是用来代替重量级锁的,它的本意是在没有多线程竞争的前提下,减少传统的重量级锁使用操作系统互斥量产生的性能消耗。
1 从偏向锁升级而来,如果一个线程正在持有偏向锁,同时该线程并没有离开同步代码块,该偏向锁直接升级为轻量级锁。 2 如果之前持有偏向锁的线程已经离开了同步代码块,如果此时有另外的线程竞争,该对象变成无锁,然后该线程从无锁获取到轻量级锁。 网上很多文章都说,轻量级锁有自旋过程。确实是有自旋的过程,不过自旋的...
可以看到Mark Word字段有个很重要的作用就是记录当前对象锁状态,最后3bit字段用来标记当前锁状态是无锁、偏向锁、轻量级锁还是重量级锁。 (1)lock:锁状态标记位,占两个二进制位,由于希望用尽可能少的二进制位表示尽可能多的信息,因此设置了lock标记。该标记的值不同,整个Mark Word表示的含义就不同。
偏向锁有一个不好的点就是,一旦出现多线程竞争,需要升级成轻量级锁,是有可能需要先做出销撤销的操作。 而销撤销的操作,相对来说,开销就会比较大,其步骤如下: 在一个安全点停止拥有锁的线程,就跟开始做GC操作一样。 遍历线程栈,如果存在锁记录的话,需要修复锁记录和Markword,使其变成无锁状态。
轻量级锁是指在满足一定的条件内,使用CAS(自旋)来尝试获取对象锁的一种机制,如果超过以下条件,则会膨胀为重量级锁:1)在jdk1.6前,默认10次,可通过-XX:PreBlockSpin来修改,或者自旋线程数超过CPU核数的一半。2)jdk1.6之后,引入了自适应自旋锁,次数并非一成不变。根据获取锁的成功率来决定是否能有更...