Java查漏补缺(二)关于锁机制

java中锁机制

java堆中存放的是所有对象,方法区中存放着类信息、常量、静态变量等。当多个线程在竞争其中的一些数据时,需要锁机制对其进行限制。

每个对象都拥有一把锁,锁存放在对象中,锁中记录了当前对象被哪个线程占用。

在这里插入图片描述
在这里插入图片描述
java中synchronized关键词可以用来同步线程,被编译后会生成monitorenter和monitorexit两个字节码指令来进行线程同步。

在这里插入图片描述
关于monitor
当一个线程进入了monitor,其他线程只能等待,只有当该线程退出,其他线程才有进入的机会。

在这里插入图片描述

synchronized的同步机制:
当A进入monitor,它就处于active状态。
如果该线程需要暂时让出执行权,该线程就进入wati set,状态被标记为waiting。
当线程B进入monitor后并完成了任务,可以通过notify的形式来唤醒wait set中的线程A,让线程A再次进入monitor来进行任务。

*Java6中引入四种锁:
*
无锁:没有对资源进行锁定,所有线程都能够访问到同一资源。
1.无竞争
2.存在竞争,非锁方式同步线程。(CAS,无锁性,只让一个线程 进来,效率高)

偏向锁:只让被提前设定的线程进入。(偏爱)通过线程id来确认当前想要获得对象锁的这个线程是不是老顾客。如果发现有多个线程来竞争时,偏向锁升级为轻量级锁。

轻量级锁:
在这里插入图片描述
当其他线程也想要进入该资源中时,就会发生自旋(即不断循环尝试着看一下目标对象的锁有没有被释放,如果释放了就获取,如果没有就一直循环)自选相当于cpu空转(采用适应性自旋优化)。

重量级锁:自旋等待的线程超过一个,轻量级锁就会升级为重量级锁。需要通过Monitor来对线程进行控制,将会完全锁定资源。
对应了mark word中的四种状态

总结:在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值