内存一致性错误 - Memory Consistency Errors

线程通信,主要通过共享访问进程资源。这种通信方式非常高效,但存在两个问题:线程冲突(thread interference)内存一致性错误(memory consistensy errors)

解决这两种问题的方法是 线程同步(thread synchronization)。在介绍线程同步之前,先来了解一下这两个问题。

这篇文章介绍第二个问题:内存一致性错误。

内存一致性错误

Memory consistency errors occur when different threads have inconsistent views of what should be the same data.

当不同的线程对于同一个数据有不一致的值时,产生内存一致性错误(Memory consistency errors)

产生 memory consistency error 的原因稍复杂,不过我们并不需要知道这其中的细节,只需要知道如何避免该错误。

要避免 memory consistency error,需要理解 happens-before 关系。这个关系是一个简单的保证,保证当内存被一个特定的操作修改时,对于另一个操作是可见的。

注:参考下边的例子,再回来理解上边的内容

一个例子

令一个属性 couter 声明并初始化

int counter = 0;

这个 counter 被线程 A 和线程 B 共享

假定线程 A 对 couter 的操作为

couter++;

假定线程 B 对 couter 的操作为

System.out.println(couter);

如果上述两个操作在同一个线程,则可以肯定,最终输出的结果为1。但这两个操作分别在两个线程中执行,线程 B 最终输出的结果可能为0,因为无法保证线程 A 对 couter 的操作对于 B 是可见的 —— 即 B 无法判断 A 是否正在修改值

除非我们为 A 和 B 建立一个 happens-before 关系。

建立 happens-before 关系,方法就是 线程同步(Thread Synchronization)。这在另一个文章中详谈。


其实我们已经已经见过这种 happens-before 关系

  • 当一个语句调用 Thread.start 创建新线程时,该语句之后的操作不仅和该语句有了 happens-before 关系,且和新线程中的 run 方法包含的所有操作都有了 happens-before 关系 —— 简单的说,就是主线程已知一个新线程要运行,对此主线程可以做一些处理,比如调用新线程的 Thread.join 方法等待其运行结束。

  • Thread.join 同理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值