偏向锁,轻量级,重量级锁的理解(摘选)

1:对象头 

首先了解下32bit的Java对象头如下: 

通过上面的表格,我们可以看出,synchronized用的锁是锁在Java对象头中的,Java的每个对象都可以作为锁,具体表现为下面三种方式: 

a:对于普通的方法,锁是当前的实例 

b:对于静态方法,锁是当前类的Class对象 

c:对于同步方法块,锁是Synchronized括号中配置的对象

从JVM规范中看出,同步代码块和同步方法,在实现的细节上有所不同,同步代码块是通过monitorEnter和monitorExit指令来实现的,同步方法在虚拟机规范规范中没有详细的说明,当线程执行到monitorEnter的时候,将尝试获取当前对象所对应的monitor所有权,即尝试获取对象的锁。

下面讲讲我对锁的理解:

偏向锁: 

a:偏向锁的获取 

大多数情况下,锁不存在多线程的竞争,而总是由同一个线程获取,为了让线程获取到锁的代价更低而引入了偏向锁,当一个线程需要访问同步代码的时候,会在栈桢中存储当前线程的线程ID,以后该线程进入和退出同步代码块的时候,不需要通过CAS进行加锁和解锁,只需要简单的检查一下栈桢中保存的线程ID是否和当前运行的线程ID一样,如果测试成功,表明线程已经获取到了锁,如果测试失败,表明有竞争,当到达安全点的时候获得偏向锁的线程被挂起,偏向锁升级为轻量级锁,然后被阻塞在安全点的线程继续往下执行代码。

b:偏向锁的释放 

偏向锁只用遇到其他线程尝试竞争偏向锁的时候,持用偏向锁的线程才会释放锁,线程不会主动去释放偏向锁,偏向锁的释放,需要等到全局安全点(这个时间点上没有字节码正在执行),他会首先暂停拥有偏向锁的线程,判断锁是否是处于被锁定的状态,撤销偏向锁后恢复到未锁定的状态或轻量级的状态。

c:关闭偏向锁 

偏向锁在Java6和Java7中是默认开启的,但是他在程序启动几秒钟后才激活,如果有必要,可以通过-XX:BiasedLockingStartupDelay=0来关闭,如果确定应用程序的锁通常处于竞争状态,可以通过JVM参数关闭偏向锁,-XX:UseBiasedLocking=false。那么程序会默认进入轻量级锁状态。

优缺点: 

优点是加锁和解锁不需要额外的消耗,和执行非同步代码块所用的时间相差很少。缺点是如果线程间存在锁的竞争,就会带来额外的消耗,使用于一个线程访问的场景。

轻量级锁: 

a:轻量级锁加锁 

在线程执行到当前的同步代码的时候,JVM会现在当前线程的栈桢中创建用于存储锁记录的空间,并将对象头中的Mark Work复制到锁记录中,广发称之为Displaced Mark Word,然后尝试使用CAS将对象头中的Mark Word指向锁记录的指针,如果成功,表示当前线程获取锁,如果获取失败,表明其他线程竞争锁,当前线程尝试使用自旋来获取锁。

b:轻量级锁的解锁 

轻量级锁解锁的时候,会使用原子的CAS操作将Displaced Mark Word替换回对象头,如果成功,表示没有竞争,如果失败,表明当前锁存在竞争,锁就会膨胀成重量级锁。

优缺点: 

优点是竞争的线程不会阻塞,提高线程的响应的速度,缺点是如果获取不到锁,使用自旋会消耗CPU,适用与多个线程交替进入同步块的场景。

重量级锁: 

Java的线程是映射到操作系统原生的线程之上的,如果要阻塞或者唤醒一个线程就需要操作系统的帮忙,这就要从用户态转换到核心态,因此需要花费更多的处理器的时间,对于简单的代码,可能状态的转换消耗的时间比用户执行代码所需要的时间还要长,所以说synchronized是Java语言的一个重量级锁。

优缺点: 

优点是线程不使用自旋,不会消耗CPU,缺点是线程阻塞,响应时间慢。适用于多个线程同时进入同步代码块的场景。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容