多线程中竞态条件与临界区简介说明

转自:

多线程中竞态条件与临界区简介说明

在java的多线程中,多个线程同时运行,如涉及共享资源的访问(变量,数组,对象,数据库,webService,文件)等,则会出现相应的写操作时,其结果同我们的预期不同,我们将这称之为“线程不安全”,
下文将演示线程不安全的代码

public class TestClass {
    protected long count = 0;
    public void add(long value){
        this.count = this.count + value; 
    }
}

当线程A和B同时运行同一个TestClass的实例对象中的add()方法,此时操作系统可能进行切换操作, 则会出现以下的效果:

cpu运行顺序
	  this.count = 0;
   线程A:读取 this.count 到一个寄存器 (0)
   线程B:读取 this.count 到一个寄存器 (0)
   线程B:将寄存器的值加2
   线程B:回写寄存器值(2)到内存. this.count 现在等于 2
   线程A:将寄存器的值加3
   线程A:回写寄存器值(3)到内存. this.count 现在等于 3
理论上上述线程得到的结果应该为5,
但是他实际运行情况,其结果为3

竞态条件&临界区

当两个线程竞争同一资源时,
当对资源的访问顺序有一定限制,我们将其称之为"竞态条件" 导致竞态条件发生的代码区称作"临界区"


例子中的add()方法就是一个临界区,它会产生竞态条件,所以在并发编程中,我们需特别关注其条件

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值