マルチスレッド化の大きな問題とそれを使用する理由は、複数のことが同時に起こっていることです。突然、あなたのスレッドがアクセスする、スレッドにローカルではない変数の値はいつでも変更できます。したがって、あなたは、あなただけの数字、このコードで1-10のものに印刷している可能性があります
int x = 0; //supposing that this was allowed to be non-final...
private class myRun implements Runnable{
@Override
public void run() {
for (int i=0; i<10; i++) {
System.Out.Println(x++);
}
}
}
をしかし、そのクラス内の他のコードは、xの値を変更した場合、現実には、あなたは230498印刷し終わる可能性 - 230508をx の値は、ループの途中でイベントが変化する可能性があります。特定の値を持つx
に頼ることができない場合や、以前に割り当てた値を保持していない場合は、コードで使用するのは無駄になります。変数が帽子のドロップで変化する可能性がある場合は、なぜ変数を使用しますか?
Javaを使用することをまったく禁止するのではなく、Javaではfinal
とする必要があります。他のスレッドからx
の値を決して変更しないことを「約束する」ことができますが、まずそれをfinal
にしてコンパイラを助けてください。確かに、x
に割り当てられた初期値にしかアクセスできませんが、変数の初期値にアクセスできるだけでは、それをまったく使用できない場合よりも優れているため、残りのデータを利用するスレッドの能力を効果的に遮断しますあなたのクラスの。
これが言語の定義方法であるためです。おそらく、*匿名の内部クラス*内の上記のメソッド内で*変数*が変更されないようにする。 (私はそれも実装を簡素化すると信じています:*値*だけがプロキシを匿名型にコピーする必要があり、完全なクロージャのセマンティクスで必要とされるように元の変数を保持する必要はありません) –
そうではありませんでしたが、あなたの変数は警告なしにいつでも変更される可能性があります。 – jahroy