天天都会听到的锁与synchronized,这次好好聊一下。

这次的话题是有关synchronized和锁的相关讨论。
对于这两个东西,我们应该知道什么?锁的膨胀升级?乐观锁悲观锁?可重入?CAS与ABA?synchronized的原理?
先抛开这些问题,对于synchronized关键字本身,我觉得大家都或多或少的有一些了解,它作为一个关键字,代表了同步的意思。但我认为锁本身也比较抽象,所以我觉得这两个东西应该放在一起互相讨论。
先说说能被我们所看到的synchronized关键字吧,由于它是关键字,所以讨论它的原理不应该局限于java的代码,应该放在编译后的字节码里探讨。对于这个相信你也许也见过了这里就不放图了。(这个随便搜一篇应该都有)底层在实现同步代码块时其实是加了一个monitorenter(监视器进入)和monitorexit(监视器离开)来保证同步,其实有些像try-finally的方式。如果是同步方法,则是加了一个ACC_SYNCHRONIZED标识。所以可以说synchronized关键字在本质上实现了一个监视器锁,这是一个重量级锁。
那么此时就要探讨另一个话题了:锁的升级。锁可以分为:无锁,偏向锁,轻量级锁和重量级锁。升级也是这个顺序升级。无锁不做解释了,偏向锁指单个线程反复取锁时,锁产生了“偏向”,可以根据对象头里的MarkWord(对象标记)直接使用而无需获取锁,但当出现额外线程竞争时,膨胀为轻量级锁,但条件是基本不存在竞争,如果需要等待,则自旋等待,自旋可以理解为自己在空循环。最后如果经过一定次数的自旋仍然不能获取,或者自旋时又出现其他线程来获取资源,就会膨胀为重量级锁,这样就会直接阻塞,直到释放出锁。
这里还要单独解释一下对象头这个问题,java的对象模型组成是四个部分,1.对象标记 2.类型指针 3.真实数据 4.内存补齐。前两个部分并称对象头。对于数据没什么好说的,内存补齐也就是为了方便寻址牺牲空间,类型指针就是指向数据类型,这里对象标记需要单独说一下。
这一部分会保存一些运行时的数据,比如hashcode,GC分代标识,还有就是最重要的锁的标识,对于轻量级和重量级锁,还会有指针。(轻量级时指向锁记录,重量级时指向锁),这部分主要为了帮助理解锁,所以不再作过多描述。
经过一大段的抽象内容,先缓缓,看看什么是可重入,其实包括synchronized以及reentrantlock(毕竟这个单词翻译过来就叫可重入锁)在内,都是可重入锁,就是说有了外面的大锁就可以自动获取了里面的小锁。
最后再来一个话题,关于乐观锁与悲观锁以及CAS。
乐观锁与悲观锁是两种概念,悲观锁觉得每个操作都是不放心的,只好在每个线程拿数据时上锁,下一个线程只好一直等到上一个操作完释放锁才行。乐观锁则比较乐观的认为只需要验证一下结果是好的就行。CAS就是一种乐观锁的实现。CAS是compare and swap,意思是比较并替换,刚好符合了乐观锁的核心需求,对于CAS的实现原理其实是cpu层面的一种原子操作。对于这两种锁的应用,悲观锁在数据库中应用广泛,乐观锁则对应一些读操作更多的场景。
CAS在许多地方都有所体现,其本质是包含一个内存值V,一个预期旧值A,一个修改值B,对比过V和A确认无误后,则把B赋给V完成替换。所以会有一个很常见的问题ABA问题,因为只对比了最终结果,所以很可能是A修改为B再修改回A,但在对比过后发现还是A则认为是没有操作发生,所以为了解决这样的误解,我们可以通过加一个版本号标识的验证,更改为1A变成2B再变成3A来进行双重验证,这样就改善了ABA问题。
之后来一部分扩展内容,关于atomic包,意思是一系列原子操作,属于juc(java.util.concurrent java并发工具包)里面有许多类比如AtomicInteger,这里的方法基本都是去调用了unsafe类里的native方法来实现CAS,所以不放代码了,感兴趣可以自己看。
最后的最后总结一下,对于synchronized关键字的原理以及锁的优化(锁的升级+自旋,当然还有别的但我记不住没写),可重入锁的特点,悲观锁与乐观锁以及CAS相关的东西。对于锁这个话题,下次被问到也许不是很慌了吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值