【牛客网】-【并发详解】-【锁】

请添加图片描述
同步方法就是成员方法
synchronized加在同步代码块前面,后面会跟一个(这里面的对象是锁){代码块}
synchronized加在成员方法前面,后面不用加(),锁就是当前实例对象
如果你是32位系统,一个字宽就是32,如果你是62位系统,一个字宽就是62
对象头存储对该对象的描述,是这个对象的元数据
对象体:存储对象的具体的业务数据
请添加图片描述
随着竞争的加剧,锁状态由无锁、偏向锁、轻量级锁、重量级锁不断演变,锁标识位也随之变化
无锁表示没有线程访问临界区(同步块),当有线程访问临界区时(一个线程访问时),他会变成偏向锁,当有多个线程并发访问时,变成轻量级锁,此时锁加在了线程的栈帧中,上述指针就指向这个栈帧,多个线程并发时,会自旋抢锁,抢不到锁会阻塞,变成重量级锁

如果我加上锁,别的线程没有阻塞,别的线程在自旋,以原子的方式(cas的方式)去抢锁,这就是轻量级锁,重量级锁就是我加上锁后,别的线程就阻塞了。

请添加图片描述
请添加图片描述
请添加图片描述
假如线程1访问了临界区(同步块),查看对象头是否存了线程1,没存的话,就把线程1保存在对象头中(CAS替换Mark word中线程id的值),保存成功后,就处于偏向锁状态了,此时关联的Mark word的值为T1/EPOCH/1/01,即线程1/一个纪元/分代年龄/锁的标志,接下来执行同步体。一旦有竞争,偏向锁就会发生变化,假设线程1正在执行同步体,然后线程2也来访问同步体了,依旧判断对象头中是否保存了线程2,肯定没保存啊,然后尝试把线程2保存在对象头中(CAS替换Mark word中线程id的值),因为此时对象头中已经保存了线程1的ID,所以肯定替换失败,然后就会触发撤销偏向锁的流程,由jmm来撤销,jmm先暂停线程1,然后解锁,将线程ID置空,此时Mark word的值为0/01,解锁完成后恢复线程1。接下来两个线程就公平的去抢锁

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值