lock.acquire是否會等待获取锁相關問題

lock.acquire是否會等待获取锁相關問題

老師,關於lock.acquire是否會等待获取锁這方面我不是很明白,在分布式鎖的2-16節,lock.acquire是會等待获取锁的,但這邊這裡不會,我觀察了一下,兩部視頻的差別似乎在於會等待的是來自兩個不同的jvm,來自相同jvm的則好像不會等待,問題大概可分為下面3點

1.是不是相同jvm只會有一個thread的lock.acquire返回true? 所以n個jvm則最多可能有n個返回true?

2.返回false的就直接返回了? 而返回true則是在返回true前就block住了 直到可以運行時運行完才返回true?

3.結論是否可整理為 來自不同的jvm會阻塞等待,來自相同jvm的則不會阻塞等待?

在这里输入代码,可通过选择【代码语言】突出显示

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

lock.acquire 会等待锁的,这一节用的是zk的分布式锁,在acquire传了参数,超过了参数的时间,就会返回false。

不同jvm之间的锁就是分布式锁,需要借助第三方组件来完成,比如:redis,zookeeper。

  • pinkyTseng 提问者 #1
    老師,這邊我還是很不懂,如果會等阻塞待鎖,理論上這邊db的操作應該會後蓋前啊,而且這邊看影片也沒超過30秒也沒把key刪掉,所以感覺照理說應該排在後面的db操作會蓋掉前面? 但是這邊看影片的log insert那也沒拋出db insert違反unique constraint的error,所以感覺應該是執行最早那第一個才對? 很困惑的是 因為沒超過30秒應該不會返回false, 不會返回false就應該會等待執行, 等待執行就應該都會執行到且會後蓋前, 但看視頻感覺不是這樣 我覺得我這問題應該和 https://class.imooc.com/course/qadetail/195471 這篇是一樣的 但我這篇答案我看不明白,加上觀察兩張截的現象和我查到的資料 https://leokongwq.github.io/2018/06/17/zookeeper-curator.html 所以我才以為是我說的這樣 這邊真的很困惑 再請老師幫忙指點迷津 萬分感激
    2020-10-16 17:51:48
  • 凌波微步 回复 提问者 pinkyTseng #2
    你可以做个简单的例子,只针对lock.acquire()。 lock.acquire(),可以定义10s,超过10s就返回false。然后再将线程休眠20s。 启动2个服务,然后分别请求两个服务的同一个方法。 其中,第一个请求,请求第一个应用,获取到锁,然后休眠20s; 第二个请求,请求第二个应用,获取不到锁,应该会过10s后返回false。 你可以试一下。
    2020-10-19 14:01:05
  • pinkyTseng 提问者 回复 凌波微步 #3
    好的 我再研究看看
    2020-11-01 11:15:46
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师