线程冲突 - Thread interference

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

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

这篇文章先介绍第一个问题:线程冲突。线程

线程冲突

当两个运行在不一样线程的操做,做用在同一个数据上,会发生线程冲突 (Thread interference)code

这也意味着,两个操做分别由多个步骤组成,且两个操做同时执行,会致使步骤交叠进程

一个例子

这里有一个类 Counter内存

class Counter {
    private int c = 0;

    public void increment() {
        c++;
    }

    public void decrement() {
        c--;
    }

    public int value() {
        return c;
    }
}

看起来,Counter中的操做不会产生交叠。好比increment()方法中,惟一的 statement 是c++资源

然而,即便是一个简单的 statement,在JVM中也会转换为多个步骤 —— 即该 statement 非原子操做rem

一个简单的 statement c++,能够简单分为三步 ( c--同理 )同步

  1. 取出当前c的值io

  2. 将取出的值增长1

  3. 将取出的值存储至c(覆盖原值)

假设,线程A调用increment()的同时,线程B调用decrement()。则两个操做可能产生以下交叠

  1. Thread A: 取出 c.

  2. Thread B: 取出 c.

  3. Thread A: 将取出的值增长 1.

  4. Thread B: 将取出的值减小 -1.

  5. Thread A: 将取出的值存储至 c; c == 1.

  6. Thread B: 将取出的值存储至 c; c == -1.

线程A的结果丢失,被线程B的结果覆盖。这是一种可能的结果,也可能线程B的结果被A覆盖;或没有交叠,
不发生错误 —— 线程冲突 的结果不可预料,bug很难被发现而且修复

相关文章
相关标签/搜索