2
class EverythingMustBeInAClass
{
    private final int i = 42;
    private final int[] a = {2, 3, 5, 7, 11, 13, 17, 19};
}

iが宣言されているという事実finalにより、すべてのスレッドが同じ int 値 42 (0 ではなく) を参照することが保証されます。

aが宣言されているという事実により、すべてのスレッドが同じ配列参照finalを参照することが保証されます。

しかし、すべてのスレッドが (0 ではなく)同じ配列要素を参照するようにするにはどうすればよいでしょうか? 後で配列要素を変更するつもりがない場合でも、配列へのアクセスを同期する必要がありますか?

4

3 に答える 3

5

final配列参照が表示されるだけでなく、オブジェクト自体が完全に構築および初期化されていることも保証します。そのため、配列内の値もすべてのスレッドで表示されます。

この件に関する良いリンクは次のとおりです。

http://www.javamex.com/tutorials/synchronization_final.shtml

引用するには:

最終参照を介してアクセスされるオブジェクトのフィールドも、少なくともコンストラクターが終了したときと同じくらい最新であることが保証されます。

ただし、a配列は不変ではないことに注意することが重要です。たとえば、設定a[0] = 10してもその更新は同期されません。しかし、値を変更しない限り、問題はありませんa

于 2012-06-18T19:10:28.683 に答える
1

コンテンツを変更するつもりがない場合は、「セマンティクスの前に発生する」ため、安全です。

于 2012-06-18T19:11:11.710 に答える
0

いいえ、データ構造がキーワード final を使用する場合、アクセスを同期する必要はありません。変数に書き込みを行わない限り、必要な数の同時読み取りを行うことができます。final キーワードを使用しない場合は、変数にアクセスするたびに変数をロックする必要があります。

于 2012-06-18T19:11:49.197 に答える