【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的线程可以看见宿主线程执行过的变量

你可能感兴趣的:(java并发编程)