你真的知道Java同步锁何时释放?

本文探讨了Java多线程中关于同步锁的释放问题,特别是wait()和notify()方法的使用。当线程调用wait()会释放锁进入等待池,而notify()或notifyAll()会唤醒等待池中的线程竞争锁。同时,文章对比了sleep()与wait()的区别,强调wait()需在同步块内调用并会释放锁,而sleep()不释放锁。
摘要由CSDN通过智能技术生成

在测试java多线程中有关 “生产者和消费者” 这个经典问题的时候,写代码测试的时候,思考到一些问题(所以还是要动手,实践才能储真知啊),
synchronize 同步锁何时释放,何时获得?重新获得锁资源之后,代码时从哪里开始继续执行的呢?

了解到,锁用到的对象上上面原来有两种池, 1)对象的锁池, 2)对象的等待池。

  • 执行线程sleep: 不会释放cpu资源,也不会释放锁资源。
  • 执行wait: 释放cpu资源,也会释放锁资源。

所以总结有:

在Java对象中,有两种池
琐池-----------------------synchronized
等待池---------------------wait(),notify(),notifyAll()

  • 如果一个线程调用了某个对象的wait方法,那么该线程进入到该对象的等待池中(并且已经将锁释放),
  • 如果未来的某一时刻,另外一个线程调用了相同对象的notify方法或者notifyAll方法,
  • 那么该等待池中的线程就会被唤起,然后进入到对象的锁池里面去获得该对象的锁,
  • 如果获得锁成功后,那么该线程就会沿着wait方法之后的路径继续执行。注意是沿着wait方法之后

其他答案:

wait中的线程是不会去竞争对象锁的。 据我所知,开始由于调用了对象的wait方法,线程处于该对象的等待池中,
而后,只

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java架构没有996

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值