采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师,在如图所示的代码的最后一行return语句执行过程中,可能存在其它写线程已经修改了数据,那么结果不还是不正确的吗?这是怎么处理保证正确性呢?
你好,这是读操作,所有的读主要保证根据当前数据返回最新的结果而已,线程不安全指的是当前的更新忽略了其他线程的更新,导致更新的结果不正确。
如果你认为这个有问题,那你任何一次查询都是有问题的,因为你此次查询完后其他线程之后也可以过来修改数据,在那个时间点看这次查询的数据也是错误的。你仔细想想看是不是这么一回事。
可是这个函数的目的不是进行最后一步计算距离的操作吗,如果不管在这个操作进行过程中其他写锁的修改,它最后得到的结果中使用的x是写锁修改前的x,那么前面为什么要进行stamp的确认呢?反正用的也是修改前的x,不用因为在获取stamp之后确认之前有写线程修改过而重新获取x
这个函数在操作时本身就已经先拿读锁再操作了,已经可以保证当前是最新的了。只有更新操作才涉及线程安全问题,读操作只要保证自己计算是是用当前最新的数据去操作就可以了。退一步来说,即使有线程安全问题,也只能是调用这个方法可能有问题。 你在实现任何读操作也是这样子啊,你会尝试获取当前最新的数据,比如db,然后去根据获取到的最新的数据去做一些简单计算然后返回给上一层。如果你读取完处理返回给上层过程中,db数据修改了,这时你会选择去不断读db吗?肯定不会,如果你要继续去读db那么你根本不知道什么时候可以不用再去读db,因为你根本不知道什么时候db没有修改,你也无法知道
对于这个函数来讲,如果给"读取+操作"整个过程加上悲观读锁,就不会出现从操作到返回结果过程中有写锁改变x的情况,保证了返回结果时始终是当前最新的,乐观读锁好像就不能保证返回结果时是当前最新的
登录后可查看更多问答,登录/注册
构建完整并发与高并发知识体系,倍增高薪面试成功率!
1.8k 1
1.2k 18
1.2k 15
3.7k 12
1.3k 12
购课补贴联系客服咨询优惠详情
慕课网APP您的移动学习伙伴
扫描二维码关注慕课网微信公众号