请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

stampedlock示例代码问题

老师,在如图所示的代码的最后一行return语句执行过程中,可能存在其它写线程已经修改了数据,那么结果不还是不正确的吗?这是怎么处理保证正确性呢?
图片描述

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

插入代码

1回答

Jimin 2019-02-21 23:46:21

你好,这是读操作,所有的读主要保证根据当前数据返回最新的结果而已,线程不安全指的是当前的更新忽略了其他线程的更新,导致更新的结果不正确。

如果你认为这个有问题,那你任何一次查询都是有问题的,因为你此次查询完后其他线程之后也可以过来修改数据,在那个时间点看这次查询的数据也是错误的。你仔细想想看是不是这么一回事。

1 回复 有任何疑惑可以回复我~
  • 提问者 红邮筒 #1
    可是这个函数的目的不是进行最后一步计算距离的操作吗,如果不管在这个操作进行过程中其他写锁的修改,它最后得到的结果中使用的x是写锁修改前的x,那么前面为什么要进行stamp的确认呢?反正用的也是修改前的x,不用因为在获取stamp之后确认之前有写线程修改过而重新获取x
    回复 有任何疑惑可以回复我~ 2019-02-22 00:02:40
  • Jimin #2
    这个函数在操作时本身就已经先拿读锁再操作了,已经可以保证当前是最新的了。只有更新操作才涉及线程安全问题,读操作只要保证自己计算是是用当前最新的数据去操作就可以了。退一步来说,即使有线程安全问题,也只能是调用这个方法可能有问题。
    你在实现任何读操作也是这样子啊,你会尝试获取当前最新的数据,比如db,然后去根据获取到的最新的数据去做一些简单计算然后返回给上一层。如果你读取完处理返回给上层过程中,db数据修改了,这时你会选择去不断读db吗?肯定不会,如果你要继续去读db那么你根本不知道什么时候可以不用再去读db,因为你根本不知道什么时候db没有修改,你也无法知道
    回复 有任何疑惑可以回复我~ 2019-02-22 00:56:16
  • 提问者 红邮筒 回复 Jimin #3
    对于这个函数来讲,如果给"读取+操作"整个过程加上悲观读锁,就不会出现从操作到返回结果过程中有写锁改变x的情况,保证了返回结果时始终是当前最新的,乐观读锁好像就不能保证返回结果时是当前最新的
    回复 有任何疑惑可以回复我~ 2019-02-22 07:18:15
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

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

帮助反馈 APP下载

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

公众号

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