Synchronized解析和锁升级过程

前言:

Synchronized对于Java小伙伴们不陌生了,作为一个java日常开发中比较常见的的本地锁,当然还有ReentrantLock可重入锁,最初版本中 ReentrantLock 的性能是远远强于 Synchronized 的,后续java在一次次的版本迭代中 对 Synchronized 进行了大量的优化,直到 jdk1.6 之后,两种锁的性能已经相差无几,甚至 Synchronized 的自动释放锁会更好用。今天我们主要说一下Synchronized同步锁

Synchronized使用:

使用Synchronized的时候也很方便有以下俩种方法:
1、直接贴在方法上(锁住的是当前类的字节码文件)
2、贴在代码块儿上(锁住的是对象)

//直接贴在方法上
public synchronized void test1(){
        // TODO
    }
//贴在代码块儿上
    public void test2(){
        synchronized (this){
            //todo
        }
    }

那么在程序运行中Synchronized锁的这一块代码发生了什么?

先上图


image.png
  • 在线程运行过程中,线程先会去抢对象的监视器,这个监视器是对象独有的就相当于一把钥匙,抢到了,那么你就获得了当前代码块的执行权
  • 其他没有抢到的线程就会进入队列(SynchronizedQueue)当中等待,等待当前线程执行完后,释放锁,再去抢监视器;
  • 最后当前线程执行完毕后通知出队然后继续重复次过程
  • 从 jvm 的角度来看 monitorenter 和 monitorexit 指令代表着代码的执行与结束 。

SynchronizedQueue

  • SynchronizedQueue 是一个比较特殊的队列,它没有存储功能,它的功能就是维护一组线程,其中每个插入操作必须等待另一个线程的移除操作,同样任何一个移除操作都需要等待另一个线程的插入操作。因此队列内部其实是没有任何一个元素的,或者说容量为0;严格说并不是一个容器。由于队列没有容量,因此不能进行peek操作,因为只有移除元素的时候才有元素;

jdk1.6以前 Synchronized 是一个重量级锁:

image.png

这就是为什么说,Synchronized 是一个重量级锁的原因, 因为每一次锁的资源都是直接和 cpu 去申请的,而 cpu 的锁数量是固定的 ,当 cpu 锁资源使用完后还会进行锁等待,这是一个非常耗时的操作。

但是在jdk1.6,针对代码层面进行了大量的优化,也就是我们常说的锁升级的过程。

image.png
  • 无锁:对象一开始就是无锁的状态;
  • 偏向锁:相当于给对象贴了一个标签(将自己的线程Id存入对象头中),下次我在进来的时候,发现标签就是我的,我就可以继续使用了
  • 自旋锁:自旋锁,说白了就是自旋,想象一下有一个厕所,里面有一个人在,你很想上但是只有一个坑位,所以你只能徘徊等待,等那个人出来以后,你就可以使用了 。 这个自旋是使用 cas 来保证原子性的。
  • 重量级锁:直接向 cpu 去申请申请锁 ,其他的线程都进入队列中等待。

锁升级是什么时候发生的?

  • 偏向锁:一个线程获取锁时会由无锁升级为偏向锁
  • 自旋锁:当产生线程竞争时由偏向锁升级为自旋锁,想象一下 while(true) ;
  • 重量级锁:当线程竞争到达一定数量或超过一定时间时,晋升为重量级锁

锁的信息是记录在哪里的?

image.png
  • 这张图是对象头中 markword 的数据结构 ,锁的信息就是在这里存放的,很清楚的表明了锁在升级的时候锁信息的变动, 其实就是通过二进制的数值,来对对象进行一个标记,每个数值代表一种状态 。

既然synchronized有锁升级那么有锁降级吗?

  • 在 HotSpot 虚拟机中是有锁降级的, 但是仅仅只发生在 STW 的时候 ,只有垃圾回收线程能够观测到它,也就是说, 在我们正常使用的过程中是不会发生锁降级的,只有在 GC 的时候才会降级。

今天就讲到这吧,累啦,下回想起来的时候在讲吧 喜欢的可以插个旗点赞一下

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

推荐阅读更多精彩内容