多线程数据一致性--读者写者相关

多线程数据一致性是指在多线程环境中保持数据的正确性和安全性。当多个线程同时访问和修改共享数据时,可能会发生数据竞争和不一致的情况,导致程序的运行结果不可预测。

产生原因

数据竞争(Data Race):数据竞争发生在两个或多个线程访问同一内存位置,并且至少有一个线程进行写操作时,而且这些访问没有进行适当的同步。结果是,程序的输出可能依赖于线程的执行顺序,但由于没有设置同步机制,因此结果不可预测。

竞态条件:两个或多个进程或线程并发执行时,其最终结果依赖于执行的精确时序

先读后写

  1. 读取旧数据:如果写操作应该发生在读操作之后,但由于线程调度或其他原因,读操作先于写操作完成。那么读操作不会受到写操作的影响,读取的是旧(错误)数据。
  2. 脏读:如果写操作应该发生在读操作之后,但由于线程调度或其他原因,在写操作完成之前,读线程旧读取了变量。那么,线程就会读取到一个中间状态的数据,这可能是部分更新的,也可能是不完整的数据。
  3. 读取不一致的数据:如果数据由多个相关联的变量组成,读线程可能只读取了部分变量,而写线程在这期间更新了其中的一些变量。那么,读线程可能会得到一个不一致的状态。
  4. 不可重复读:读写序列为读-写-读,即线程A连续两次读取同一个变量,但在这两次读取之间,线程B修改了这个变量。那么,线程A的两次读取操作得到的结果不同,可能导致冲突。(数据库角度:违反事务的隔离性)

 先写后读

  1. 读取新数据:读取旧数据的反面。
  2. 读取不一致的数据:线程A更新了其中的一部分,而线程B开始读取。
  3. 脏读:线程A开始写入数据,但在写操作完全完成之前,线程B读取了数据。
  4. 不可重复读:线程B在同一个事务中两次读取同一个变量,但在这两次读取之间,线程A更新了变量。

写后写

  1. 丢失更新:线程A和线程B都读取了同一个变量的值,然后基于这个值进行计算并更新变量。如果线程A的写操作在线程B之后发生,线程B的更新将被线程A的更新覆盖,导致线程B的工作丢失。
  2. 不一致的数据:如果共享资源是一个复合数据结构,线程A和线程B分别更新不同的部分。可能会出现部分数据由线程A更新,而另一部分数据由线程B更新,导致整个数据结构处于不一致的状态。
  3. 内存一致性错误:线程A写入变量X。线程B随后写入同一个变量X。C和D分别读取A、B所在核心的缓存。
  4. 死锁:线程A持有资源X,并想要写入资源Y。线程B持有资源Y,并想要写入资源X。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值