线程冲突 - Thread interference
作者:网络转载 发布时间:[ 2016/10/28 10:23:58 ] 推荐标签:Java 线程
线程通信,主要通过共享访问进程资源。这种通信方式非常高效,但存在两个问题:线程冲突(thread interference) , 内存一致性错误(memory consistensy errors)。
解决这两种问题的方法是 线程同步(thread synchronization)。在介绍线程同步之前,先来了解一下这两个问题。
这篇文章先介绍第一个问题:线程冲突。
线程冲突
当两个运行在不同线程的操作,作用在同一个数据上,会发生线程冲突 (Thread interference)
这也意味着,两个操作分别由多个步骤组成,且两个操作同时执行,会导致步骤交叠
一个例子
这里有一个类 Counter
<code class="java">class Counter {
private int c = 0;
public void increment() {
c++;
}
public void decrement() {
c--;
}
public int value() {
return c;
}
}</code>
看起来,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很难被发现并且修复
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11