并发 -- 竞态条件 & 数据竞争


         并非所有的竞态条件都是数据竞争,同样并非所有的数据竞争都是竞态条件,但二者都可能使并发程序的失败

1. 竞态条件

        计算的正确性取决于多个线程的交替执行时序时,就会发生竞态条件。

        和大多数并发错误一样,竞态条件不总是会产生问题,还需要不恰当的执行时序

最常见的竞态条件为:

  1. 先检测后执行:执行依赖于检测的结果,而检测结果依赖于多个线程的执行时序,而多个线程的执行时序通常情况下是不固定不可判断的,从而导致执行结果出现各种问题。

        在计算机内存或者存储里,如果同时发出读写大量数据的指令的时候竞态条件可能发生,机器试图覆盖相同的或者就的数据,而此时旧的数据仍然在被读取。结果可能是下面一个或者多个情况:计算机死机,出现非法操作提示并结束程序,错误的读取旧的数据,或者错误的写入新数据。在串行的内存和存储访问能防止这种情况,当读写命令同时发生的时候,默认是先执行读操作的。

2. 数据竞争

        如果在访问共享的非final类型的域时没有采用同步来进行协同,那么就会出现数据竞争。当一个线程写入一个变量而另一个线程接下来读取这个变量,或者读取一个之前由另一个线程写入的变量时,并且在这两个线程之间没有使用同步,那么就可能出现数据竞争。

        在Java内存模型中,如果代码中存在数据竞争,那么这段代码可能使并发程序失败。

3. 并发的数据竞争(可见性)与竞态条件(原子性)

数据竞争(data race):

出现在一般数据的访问,一个读进程和写进程,如果没有进行同步,那么就会出现数据访问错误。

竞态条件(race condition):

扫描二维码关注公众号,回复: 12597154 查看本文章

如果程序运行顺序的改变会影响最终结果,这就是一个竞态条件

不是所有竞态条件都会出现数据竞争,竞态条件有时取决于运气,竞态条件指的是类中没有加锁的对象。如果一个类中没有属性变量,则称为无状态的,相反成为有状态的。多个进程,如果访问时序正确则不会出现数据等安全性问题,但进程的访问顺序是不可控的,出现安全性错误也是常见的。

第三点为引用!!!,引用博文中用的都是进程,但进程之间不是不存在数据共享的么???留有疑惑!今天没解决!等过阵理解了!再来更新!

猜你喜欢

转载自blog.csdn.net/weixin_44556968/article/details/109983183