博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程冲突 - Thread interference
阅读量:6940 次
发布时间:2019-06-27

本文共 942 字,大约阅读时间需要 3 分钟。

线程通信,主要通过共享访问进程资源。这种通信方式非常高效,但存在两个问题:线程冲突(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--同理 )

  1. 取出当前c的值

  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很难被发现并且修复

转载地址:http://vbsnl.baihongyu.com/

你可能感兴趣的文章
tree与GridView交互
查看>>
压缩算法
查看>>
PowerDesigner中批量替换name和code的脚本
查看>>
关于‘暗时间’随笔
查看>>
Javascript 中 检查一个数组是否包含某对象
查看>>
网络基础与配置
查看>>
BZOJ1050旅游
查看>>
HNOI2002营业额统计
查看>>
初步学习thinkphp5.0
查看>>
Linux常用命令(二)--文件目录命令
查看>>
tomcat启动报错
查看>>
java中生成不重复随机的数字
查看>>
由《旧制度与大革命》提取的5个感触
查看>>
hibernate 配置
查看>>
sqlserver 分页
查看>>
php通过system()调用Linux命令问题
查看>>
yii 中设置提示成功信息,错误提示信息,警告信息
查看>>
新坑:Zombie Bird 如何使用libgdx Android开发手游笔记-1
查看>>
Python学习笔记(五)
查看>>
swift 警告框 - 自定义按钮颜色,图片
查看>>