我想確保根據Java內存模型正確理解「有效不可變對象」行爲。有效不可變對象
比方說,我們有我們要發佈爲有效不可改變一個可變類:
class Outworld {
// This MAY be accessed by multiple threads
public static volatile MutableLong published;
}
// This class is mutable
class MutableLong {
private long value;
public MutableLong(long value) {
this.value = value;
}
public void increment() {
value++;
}
public long get() {
return value;
}
}
我們做到以下幾點:
// Create a mutable object and modify it
MutableLong val = new MutableLong(1);
val.increment();
val.increment();
// No more modifications
// UPDATED: Let's say for this example we are completely sure
// that no one will ever call increment() since now
// Publish it safely and consider Effectively Immutable
Outworld.published = val;
的問題是: Java內存模型是否保證所有線程都必須有Outworld.published.get() == 3
?
根據Java Concurrency In Practice這應該是真的,但請糾正我,如果我錯了。
3.5.3。安全出版習慣
要安全地發佈對象,對象的引用和對象的狀態必須同時對其他線程可見。 正確構造的對象可以通過以下方式安全地發佈:
- 從靜態初始化程序初始化對象引用;
- 將引用存儲到易失性字段或AtomicReference中;
- 將引用存儲到正確構造的對象的最終字段中;或
- 將對其的引用存儲到由鎖正確保護的字段中。3.5.4。有效不可變的對象
安全地發佈有效的不可變對象可以安全地使用任何線程,而無需額外的同步。
請顯示建立對象狀態的[* static initializer *](http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html),該對象的狀態是可見的。 – trashgod 2012-04-20 23:07:09