當不一樣的線程針對相同的數據卻讀到了不一樣的值時就發生了內存一致性錯誤。內存一致性錯誤的緣由是很是複雜的。幸運的是咱們程序員不須要詳細的理解這些緣由,咱們須要作的事情就是使用策略來規避這些。程序員
避免內存一致性錯誤的關鍵就是須要先理解happens-before
關係。這個關係只是簡單保證了一個肯定語句所寫的內存對另一個肯定的語句來講是可見的。爲了更好的明白這個,來看看下面這個例子。假設一個簡單的int
是這樣被定義和初始化:
int counter = 0;
counter
能被線程A和B訪問。假設線程A使變量增長:
counter++;
而後,線程B將它的值打印出來:
System.out.println(counter);
若是這兩個語句在同一個線程中運行,那麼可預見打印出來的值會是1,可是若是兩個語句運行在不一樣的線程中,那麼打印出來的值多是0,由於沒有辦法保證線程A改變的counter
值對線程B是可見的,除非咱們程序員可以確保這兩個語句之間的關係是happens-before
。app
有不少方法是實現happens-before
。方法之一就是使用同步。線程