finalの意味
1534 ワード
public class FinalFieldExample {
final int x;
int y;
static FinalFieldExample f;
public FinalFieldExample() {
x = 3;
y = 4;
}
static void writer() {
f = new FinalFieldExample();
}
static void reader() {
if (f != null) {
int i = f.x;
int j = f.y;
}
}
}
上のコードでは
1、スレッドAがreader()を実行する場合、f.xが3であることを保証する.xはfinalであるからである.
2、スレッドAがreader()を実行する場合、f.yが4であることを保証することはできない.yはfinalではないからである.
public FinalFieldExample() { // bad!
x = 3;
y = 4;
// bad construction - allowing this to escape
global.obj = this;
}
スレッドAはglobal.obj,この場合,スレッドAはf.xが3であることを保証できない.
final fieldの正確に構築された値が表示されます.この機能は確かにいいですが、field自体が参照である場合は、この参照がオブジェクト(または配列)を指す最新の値をコードで見たいと思っています.もしあなたのfieldがfinalであれば、これも保証できます.したがって、配列を指すfinal参照がある場合は、「他のスレッドは配列参照の正しい値を見たが、この配列の内容の誤った値を見た」と心配する必要はありません.ここで「正しい」とは、「この値はend of the object's constructorに新しく、最も最新の値を指すのではなく」スレッドAがimmutableオブジェクトimを正しく構築した後、スレッドBがimを正しく見ることができることを保証したい場合は、synchronizedを使用する必要があります.「immutableオブジェクトへの参照は、2番目のスレッドによって不思議に見える」(非immutableオブジェクトへの参照は、2番目のスレッドによって不思議に見ることができない.同様に、immutableオブジェクトへの参照も、不思議なことではない)final fieldsはいったい何を提供しているのか、はは、答えは間もなく明らかになる.これは:(はい、ここがどういう意味か分かりませんが、英語だけをここに並べましょう)The guarantees the program gets from final fields should be carefully tempered with a deep and careful understanding of how concurrency is managed in your code
私はこの意味を推測しています.
まず、コードの中で同時にどのように管理されているかを深く、よく理解してから、final fieldsがプログラムに与えた保証がどのようなものなのかをよく推敲することができます.