前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多线程--锁的升级

多线程--锁的升级

作者头像
用户7386338
发布2020-07-14 08:53:13
4330
发布2020-07-14 08:53:13
举报
文章被收录于专栏:Java患者Java患者

锁的存储

在多线程并发编程中,synchronized一般我们认为是重量级锁,但是随着JDK1.6的优化之后,在一些情况下它就不显得那么重量级了,因为在JDK1.6中为了减少获得锁和释放锁带来的性能消耗而引入了偏向锁跟轻量级锁。

synchronized有三种方式加锁,修饰实例方法、修饰静态方法、修饰代码块。那么锁是如何存储的呢?

synchronized(lock)是基于lock这个对象的生命周期来控制锁的粒度的,那么锁的存储就应该和lock这个对象有关。

在虚拟机中可以了解到对象在内存中的布局可以非为三部分:对象头、实例数据、对齐填充。

对象头就记录了对象和锁的有关信息,当某个对象被synchronized关键字当成同步锁时,那么该对象的对象头就会存在锁的标志。

自己细品。。。。。

偏向锁

如何理解偏向锁呢,当一个线程访问加了锁的代码块时,会在对象头存储当前的线程ID,后续这个线程进入和退出这段代码的时候,不需要再次加锁和释放锁。而是直接比较对象头里面是否存储了当前线程的偏向锁。如果相等则表示偏向锁时偏向于该线程的,不需要再尝试获得锁。

其实就是偏向于第一个访问锁的线程,如果在运行过程中,同步锁只有一个线程访问,不存在多线程争用的情况,则线程是不需要触发同步的,这种情况下,就会给线程加一个偏向锁。 如果在运行过程中,遇到了其他线程抢占锁,则持有偏向锁的线程会被挂起,JVM会消除它身上的偏向锁,将锁恢复到标准的轻量级锁。这里其实就是一种锁的升级,毕竟synchronized锁了代码是因为防止多个线程并发的时候对数据造成不安全,但是如果只有线程访问,那synchronized就太消耗性能了,所以做了偏向锁进行升级。。

轻量级锁

当偏向锁已经不足够使用的时候,会再次升级为轻量级锁,偏向锁运行在一个线程进入同步块的情况下,当第二个线程加入锁争用的时候,偏向锁就会升级为轻量级锁。

轻量级锁再加锁过程中,会使用到了自旋锁,而自旋锁就是指当有另外一个线程来竞争锁时,这个线程会在原地循环等待,而不是阻塞该线程,直到前面的线程释放锁了之后,这个线程就可以马上获得锁。所以轻量级锁适用于同步代码块执行很快的场景,这样线程原地等待的时间很短就可以获取到锁。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java患者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 偏向锁
  • 轻量级锁
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档