谈谈对“竞态条件”和“数据竞争”的理解

在《JAVA并发编程实战》中提到两个术语:"竞态条件"和"数据竞争"。
当时确实没看懂这两个东西有啥区别,我觉得最大的问题在于作者用鸡蛋去解释鸡蛋的原因,听完之后好像听了一段绕口令,哦,原来是这样,但我还是没听懂。
这两个术语很难分清,要知道把事情理解错了比不知道这件事情更可怕。所以花了些时间在网上去看别人是怎么理解和解释这两个术语的。
有些人用"原子性-竞态条件"和"可见性-数据竞争"来区分,但是越讲,越让我觉得这两个东西是一个东西了。
我自己花了些时间总结了一下,还请各位看看总结的是否正确。
两个术语表述的意思都是在多个线程操作同一个资源的时候,可能会导致最后的结果与预期结果不一致的问题。
但是两个术语针对的受影响的对象是不一样的。
竞态条件:强调的是被操作的资源A在被对象B操作完之后,其结果与预期的结果不一样。此时受影响的对象是被操作的资源A,并不关心操作资源的对象B是否受到此资源的影响。
比如两个线程A和B对一个数据a进行"++a"操作,如果一个线程B是在另一个线程A操作完之后再取到的数据a,则a的最终结果是正确的。如果A的操作还未完成之前,B就取到a的值并对其进行修改,那么a的最终结果与预期不符。这里就竞态条件。
数据竞争:强调的是访问资源B的对象A在访问资源B的时候取到错误的数据而出现错误的结果。此时受影响的对象是操作资源B的对象A,而不关心资源B本身是否是正确的。
比如一个线程A在修改数据a,此时线程B不知道线程A在修改数据a,并在修改还未完成的情况下取到了a的值并进行别的计算,此时B其实取到的就是错误的值,但是数据a本身没有错误。这里就是数据竞争。
由此看来,两者针对的对象并不一样,但是在同样的环境下也可能会有"竞态条件"和"数据竞争"同时出现的情况。
比如在上面竞态条件的例子中,如果A和B还有后续操作依赖于a的值,那么两种情况就同时出现了,因为不仅a的值与预期不符,而且A与B的后续计算也会因为取得错误的数据而受到影响。
当然,被操作的资源可以是基本数据类型,也可以是引用数据类型。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值