资讯专栏INFORMATION COLUMN

线程冲突 - Thread interference

lncwwn / 2662人阅读

摘要:解决这两种问题的方法是线程同步。在介绍线程同步之前,先来了解一下这两个问题。这篇文章先介绍第一个问题线程冲突。这是一种可能的结果,也可能线程的结果被覆盖或没有交叠,不发生错误线程冲突的结果不可预料,很难被发现并且修复

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

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

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

线程冲突

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

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

一个例子

这里有一个类 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 非原子操作

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

取出当前c的值

将取出的值增加1

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

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

Thread A: 取出 c.

Thread B: 取出 c.

Thread A: 将取出的值增加 1.

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

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

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65224.html

相关文章

  • 内存一致性错误 - Memory Consistency Errors

    摘要:解决这两种问题的方法是线程同步。在介绍线程同步之前,先来了解一下这两个问题。这篇文章介绍第二个问题内存一致性错误。 线程通信,主要通过共享访问进程资源。这种通信方式非常高效,但存在两个问题:线程冲突(thread interference) , 内存一致性错误(memory consistensy errors)。 解决这两种问题的方法是 线程同步(thread synchroniza...

    baiy 评论0 收藏0
  • (六) synchronized的源码分析

    摘要:关键字经过编译之后,会在同步块的前后分别形成和这两个字节码指令。当我们的把字节码加载到内存的时候,会对这两个指令进行解析。这两个字节码都需要一个类型的参数来指明要锁定和解锁的对象。最后唤醒暂停的线程。 文章简介 前面我有文章介绍了synchronized的基本原理,这篇文章我会从jvm源码分析synchronized的实现逻辑,希望让大家有一个更加深度的认识 内容导航 从synchr...

    jhhfft 评论0 收藏0
  • AbstractQueuedSynchronizer理解之一(ReentrantLock)

    摘要:有了这个基础,才能发挥作用,使得在节点取消和异常时能够保证队列在多线程下的完整性。 Doug Lea是JDK中concurrent工具包的作者,这位大神是谁可以自行google。 本文浅析ReentrantLock(可重入锁)的原理 Lock接口 showImg(https://segmentfault.com/img/bV2671?w=276&h=176); Lock接口定义了这几个...

    learning 评论0 收藏0
  • AbstractQueuedSynchronizer理解之一(ReentrantLock)

    摘要:有了这个基础,才能发挥作用,使得在节点取消和异常时能够保证队列在多线程下的完整性。 Doug Lea是JDK中concurrent工具包的作者,这位大神是谁可以自行google。 本文浅析ReentrantLock(可重入锁)的原理 Lock接口 showImg(https://segmentfault.com/img/bV2671?w=276&h=176); Lock接口定义了这几个...

    bigdevil_s 评论0 收藏0
  • AbstractQueuedSynchronizer理解之一(ReentrantLock)

    摘要:有了这个基础,才能发挥作用,使得在节点取消和异常时能够保证队列在多线程下的完整性。 Doug Lea是JDK中concurrent工具包的作者,这位大神是谁可以自行google。 本文浅析ReentrantLock(可重入锁)的原理 Lock接口 showImg(https://segmentfault.com/img/bV2671?w=276&h=176); Lock接口定义了这几个...

    yunhao 评论0 收藏0

发表评论

0条评论

lncwwn

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<