锁消除、自旋锁、偏向锁、轻量级锁、重量级锁小小简介

原创 2018年04月17日 16:20:26

Java对象头

锁存在Java对象头里

如果对象是数组类型,则虚拟机用3 Word储存对象头

如果对象是非数组类型,则虚拟机用2 Word储存对象头

32 bit JVM中,一字宽 = 32 bit= 4 byte

Java对象头信息
长度 内容 说明
32/64 bit Mark Word 储存对象的hashCode和锁信息
32/64 bit Class Metadata Address 储存对象类型数据的指针
32/64 bit Array Length 数组的长度(如果当前的对象是数组)
32 bit JVM的Mark Word默认存储结构
25 bit 4 bit 1 bit(是否为偏向锁) 2 bit(锁标志位)
无锁状态 对象的hashCode 对象分代年龄 0 01

运行期间Mark Word的储存的数据会随着锁标志位变化而变化

Mark Word有以下四种状态变化:

锁状态 25 bit 4 bit 1 bit 2 bit
23 bit 2 bit 是否为偏向锁 锁标志位
轻量级锁 指向栈中锁记录的指针 00
重量级锁 指向互斥量(重量级锁)的指针 10
GC标记 11
偏向锁 线程ID Epoch(偏向锁的时间戳) 对象分代年龄 1 01


自旋锁:

线程的阻塞和唤醒需要CPU从用户态转为核心态,过于频繁的转换对于CPU是个过重的负担,同时我们知道有些时候锁的锁定状态只会持续很短的一段时间,像是整数的自加操作,因此加入了自旋锁。
所谓的自旋就是让线程去执行无意义的循环,循环结束再去竞争锁,如果竞争不到继续循环,循环过程中线程会一直处于running状态,但是基于JVM的线程调度,会出让时间片,所以其他线程依旧有申请锁和释放锁的机会。

自旋的次数一般控制在一个范围内,例如10次、1次0次等,在超出这个范围后,自旋锁会升级为阻塞锁

锁消除:

锁消除是指虚拟机即时编译器在运行时,一些代码要求同步,但是被检测到不可能存在共享数据竞争的锁就会被削除。

锁偏向:

只有一个线程进入临界区,目的是使某个线程获得锁之后,消除CAS Mark Word的开销,让这个线程得到偏护。

轻量级锁:

多线程交替进入临。

重量级锁:

多线程同时进入临界区


参考资料【1】
参考资料【2】
参考资料【3】

java 中的锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁

之前做过一个测试,详情见这篇文章《多线程 +1操作的几种实现方式,及效率对比》,当时对这个测试结果很疑惑,反复执行过多次,发现结果是一样的: 1. 单线程下synchronized效率最高(当时感...
  • zqz_zqz
  • zqz_zqz
  • 2017-04-19 22:31:08
  • 14678

偏向锁、轻量级锁、重量级锁、自旋锁原理讲解

一、简介 在讲解这些锁概念之前,我们要明确的是这些锁不等同于Java API中的ReentratLock这种锁,这些锁是概念上的,是JDK1.6中为了对synchronized同步关键字进行优化而产生...
  • L_BestCoder
  • L_BestCoder
  • 2018-02-09 13:34:46
  • 114

《偏向锁,轻量级锁,重量级锁》优缺点对比

《偏向锁,轻量级锁,重量级锁》优缺点对比(Lock的优缺点对比) 锁 优点 缺点 适用场景 偏向锁 加锁和解锁不需要额外的消耗,和执行非同步方法相比仅存在纳秒级...
  • CSDNones
  • CSDNones
  • 2016-01-15 15:32:30
  • 1275

Synchronized的原理及自旋锁,偏向锁,轻量级锁,重量级锁的区别

在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,Java ...
  • Kirito_j
  • Kirito_j
  • 2018-01-30 00:24:16
  • 399

虚拟机内的锁优化(偏向锁,轻量级锁,自旋锁,重量级锁)

基础知识之一:锁的类型锁从宏观上分为:(1)乐观锁;(2)悲观锁。(1)乐观锁乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新...
  • hbtj_1216
  • hbtj_1216
  • 2017-08-14 16:15:28
  • 326

偏向锁,轻量级锁,重量级锁

偏向锁,轻量级锁,重量级锁标签(空格分隔): java 并发 锁偏向锁偏向锁,顾名思义,它会偏向于第一个访问锁的线程,如果在接下来的运行过程中,该锁没有被其他的线程访问,则持有偏向锁的线程将永远不需要...
  • caizs566205
  • caizs566205
  • 2016-07-06 20:31:03
  • 840

偏向锁,轻量级锁与重量级锁的区别与膨胀

一直被这三个锁的膨胀问题所困扰,不知道到底实在什么时候会有偏向锁升级到轻量级锁,什么时候由轻量级锁升级到重量级锁。找到好久,也没有找到简洁明了的答案。        综合多个方面的描述综合自己的理解,...
  • choukekai
  • choukekai
  • 2017-03-19 20:44:01
  • 5057

浅谈Java里的三种锁:偏向锁、轻量级锁和重量级锁

在学习sychronized关键字及其实现细节的时候,发现java中的三种锁,偏向锁,轻量级锁,重量级锁其实也有很多值得探究的地方,引入偏向锁是为了在无多线程竞争的情况下尽量减少不必要的轻量级锁执行路...
  • u012722531
  • u012722531
  • 2017-10-15 22:10:37
  • 333

Java轻量级锁(自旋锁)和偏向锁原理

  • 2013年10月13日 10:10
  • 695KB
  • 下载

Java线程并发中常见的锁--自旋锁 偏向锁 轻量级锁 轻量级锁

Java线程并发中常见的锁--自旋锁 偏向锁 轻量级锁 轻量级锁
  • LoveTea99
  • LoveTea99
  • 2016-09-17 17:53:42
  • 915
收藏助手
不良信息举报
您举报文章:锁消除、自旋锁、偏向锁、轻量级锁、重量级锁小小简介
举报原因:
原因补充:

(最多只允许输入30个字)