这个只在Cabinet类的setStoreNumber方法加锁不行吧。

这个只在Cabinet类的setStoreNumber方法加锁不行吧。

我的理解和文档中不一样,请老师帮忙看看哪里分析的不对:在Cabinet类的setStoreNumber方法加锁,只是对“存”的这个动作加了锁,当我“存”的动作做完了,锁就释放了,此时别人就能再做“存”的动作了,所以别人这个“存”的动作有可能在我“存”和“取”之间发生,那此时我取出来的就是别人“存”的数了,所以我觉得应该对整个cabinet对象加锁。

正在回答 回答被采纳积分+1

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

1回答
coding_zhang 2020-02-04 08:18:13

文档中的例子只针对“存”加锁,防止并发。没有说谁存的,就要谁取。


如果按照你所说的,谁“存”谁“取”,在“set”方法上加锁显然是不行的。

  • 他的意思我觉得是,你只synchronized set方法,并不能保证出来的结果是1,2,3,因为print的结果是get方法,假设A set1完释放,在执行get前,B set2完成了,那么Aprint的结果还是2
    2020-02-04 21:46:06
  • 明白你疑惑的问题了。 首先,set上加了锁,多个线程并发时,并行变成了串行。 然后,set方法执行完的那个线程,再执行print,由于多个线程是阻塞在set方法上的,所以在执行print方法时,都是一个一个执行的,不会发生并发。 而且,System.out.println底层也是加锁的。
    2020-02-05 08:17:06
  • 感谢发现文章中的问题,已及时更新。
    2020-02-06 11:48:09
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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