0

Javaのプライベートインスタンス変数へのアクセスを同期するための要件と少し混乱しています。マルチスレッドでスケジュールされたタスクを実行するアプリケーションがあります。これらのタスク(クラスのインスタンス)には、値オブジェクトを保持するインスタンス変数があります。さらに、これらのタスクには、実行ロジックを保持する他のクラスを呼び出すことによってタスクを実行する実行メソッドがあります(これらのタスクは、処理の一部としてより多くの値オブジェクトを使用します)。

これで、高レベルでは、すべての並列スレッドがこれらのタスク、インスタンス変数、実装クラス、および値オブジェクトのチェーンを生成するように見えます。これらすべてをスレッドセーフにする必要がありますか?並行して呼び出される可能性のあるすべての可能なクラスと値オブジェクトのすべてのインスタンス変数?

4

1 に答える 1

4

複数のスレッドが同時にオブジェクトにアクセスする場合、およびオブジェクトの状態が変化する場合は、オブジェクトをスレッド セーフにする必要があります。

異なるスレッドが同じタスクにアクセスしないという点で、タスク オブジェクトはマルチスレッド化されていないようです。そうであれば、タスク オブジェクトをスレッド セーフにする必要はありません。

値オブジェクトは可変であり、複数のスレッドが同じ値オブジェクトのインスタンスに同時にアクセスできるように共有されていますか? どちらかが「はい」の場合、それらをスレッドセーフにする必要があります。

オブジェクトをスレッド セーフにする最も簡単な方法は、オブジェクトを不変にすることです。オブジェクトが構築された後にその内部状態が変更できない場合、それは本質的にスレッドセーフです。オブジェクトを不変にできない場合は、状態が変更される可能性のあるインスタンス変数へのアクセスを同期する必要があります。

于 2011-11-21T05:13:51.643 に答える