被优化的synchronized和Lock对比

首先介绍发展史, synchronizedLock对比表格在最后面。(其实写了之后我发现我需要复习JUC了)


1.早期的synchronized
JDK1.6之前属于重量级锁,依赖于操作系统的Mutex Lock,Java的线程映射到操作系统的原生线程,需要操作系统申请互斥量,操作系统对线程的切换,需要从用户态切换到内核态,比较耗时,效率低

2.对synchronized的优化
JDK1.6之后在JVM层面对synchronized底层做了很多的优化,包括偏向锁,轻量级锁,自旋锁,自适应自旋锁,锁消除,锁粗化等优化技术。

2.1 偏向锁
目的:在没有线程竞争的情况下,减少传统的重量级锁使用操作系统互斥量的开销,提升性能。特点:

  • 在没有锁竞争的情况下,会把整个锁消除
  • 偏向于第一个获取到偏向锁的线程
  • 如果在接下来的执行中偏向锁没有被其他线程获取,那么拥有该锁的线程就不需要同步
    变化:在锁竞争激烈的场合,偏向锁失效。原因是,在此情况下,极有可能每次申请锁的线程不是同一个线程,所以此时不应该使用偏向锁,否则得不偿失。

2.2 轻量级锁
当偏向锁失效,JVM不会立即升级为重量级锁,而是试图使用轻量级锁的优化手段(JDK1.6之后加入的)。轻量级锁不是为了替代重量级锁,它的本意是是在没有线程竞争的情况下,减少传统的重量级锁使用操作系统互斥量的开销,提升性能。

目的:和偏向锁一样

特点:

  • 和偏向锁不同,轻量级锁使用CAS操作代替重量级锁。
  • 使用轻量级锁,不需要申请互斥量。
  • 轻量级锁的加锁和释放锁都是CAS操作。
    变化:对于大多数锁来说,在整个同步周期都不存在竞争,这来自经验数据。如果没有竞争,轻量级锁使用CAS操作,避免了使用互斥锁的开销。如果存在竞争,除了互斥锁的开销,还会有额外的CAS操作,所以如果存在锁竞争,轻量级锁比重量级锁更慢。如果竞争激烈轻量级锁会迅速膨胀为重量级锁。关于轻量级锁的原理可以查看《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版的13章第三节锁优化。

2.3 自旋锁和自适应自旋锁
轻量级锁失效后,JVM避免线程真的在操作系统层面挂起,还会进行一项成为自旋锁的优化手段。在JDK1.6之前就有这项技术了,只是他是默认关闭的,可以通过参数--XX:+UseSpinning开启。JDK1.6之后默认开启。自旋不能完全替代阻塞,因为它还要占用处理器的时间。如果锁被占用的时间短,那么自旋锁的效果就好;否则,反之。自旋等待的时间必须固定,如果超过限定的次数,仍然没有获取到锁,就挂起线程。自旋默认10次,可以使用参数--XX:PreBlockSpin修改。

2.3.1 为什么会有自旋锁
互斥同步对性能最大的影响是阻塞的实现,因为线程的挂起和恢复都需要转入内核态去完成(用户态到内核态的转换将会耗费一定的时间)。而一般线程持有锁的时间并不会太长,如果仅仅为了这一点时间而挂起或恢复线程将会得不偿失。所以JVM团队就想:"能否让后面来的请求获取锁的线程等待一会儿而不被挂起?看看持有锁的线程是否很快就会释放锁"。目的:为了减少线程的挂起和恢复,减少带来的系统开销,引入自旋锁。

2.3.2 自旋的特点
执行忙循环
自旋次数固定(默认10次)
JDK1.6之前默认关闭,之后默认打开
效果的好坏依赖于锁被占用的时间的长短

3.Synchronized和ReEntrantLock对比
① 两者都是可重入锁

两者都是可重入锁。“可重入锁”概念是:自己可以再次获取自己的内部锁。比如一个线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的,如果不可锁重入的话,就会造成死锁。同一个线程每次获取锁,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。

区别:

synchronized Lock
JVM层面,底层:monitorenter/monitorexit API层面
不需要手动释放锁 需要手动释放
不能中断 trylock设超时时间,或lockInterruptibly放入代码块设超时时间
只能是非公平锁 选择true就变为公平锁
不能精准唤醒 Lock可以绑定多个Condition,signal某个flag实现精准唤醒(我觉得这个不同点最重要)

性能已不是选择标准!!

在JDK1.6之前,synchronized 的性能是比 ReenTrantLock 差很多。具体表示为:synchronized 关键字吞吐量随线程数的增加,下降得非常严重。而ReenTrantLock 基本保持一个比较稳定的水平。我觉得这也侧面反映了, synchronized 关键字还有非常大的优化余地。后续的技术发展也证明了这一点,JDK1.6 之后 JVM 团队对 synchronized 关键字做了很多优化。JDK1.6 之后,synchronized 和 ReenTrantLock 的性能基本是持平了。所以网上那些说因为性能才选择 ReenTrantLock 的文章都是错的, JDK1.6之后,性能已经不是选择synchronized和ReenTrantLock的影响因素了。而且虚拟机在未来的性能改进中会更偏向于原生的synchronized,所以还是提倡在synchronized能满足你的需求的情况下,优先考虑使用synchronized关键字来进行同步。优化后的synchronized和ReenTrantLock一样,在很多地方都是用到了CAS操作。

所以说,实际上是ReentrantReadWriteLock才因为可以“读读共存”都用myReadWriteLock.readLock().lock();加锁并不互斥地读而高于synchronized的性能,而单一的ReentrantLock并没有比synchronized性能高

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