【Java并发编程】内存一致性错误

内存一致性错误说的是:不同线程看到的内存中的同一份数据却有不同的“视图”。这个时候我们们说发生了内存一致性错误。内存一致性错误是我们应该避免的。

而避免内存一致性错误的关键在于理解“happens-before”关系。这个关系保证了向内存中写入的一条语句可以被其他语句“看到”。我们来看下面的例子:

初始化变量counter,该变量在线程A和线程B中间共享

int counter = 0;

线程A先执行

counter++;

接着线程B执行

System.out.println(counter);

这个输出结果是多少呢,可能是1,可能是0。但是具体是哪一个是不能确定的。如果该过程不是在两个线程中执行,而是在同一个线程中执行,那么我们可以断定结果一定是1。但是由于是在两个线程中共享counter变量,当A对counter进行了自增后,没有什么可以保证线程B可以看见线程A对counter的改动。除非我们将两条语句建立了上述所说的那种“happens-before”的关系。

有许多方法保证这种关系,其中一个方法就是采取“同步”的方法。

  1. 当我们通过Thread.start方式启动一个线程。任何和该语句有“happens-before”的关系的。都与该线程中任何的语句有“happens-before”的关系。该处设计的目的是为了让创建该线程的语句可以被这个新线程看到。
  2. Thread.join的线程可以看见宿主线程执行过的变量
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值