私はオブジェクトを作成し、2つの異なるスレッドでアクセスするJavaでコードを記述しています。私の最初のthread1
スレッドは、このオブジェクトのいくつかのパブリックメソッドを実行時に呼び出します。Javaでオブジェクトがnullであることを確認します。
final Thread thread1 = new Thread(){
@Override
public void run() {
myObj.pubFunc1();
myObj.puFunc2();
myObj.pubFunc3();
}
};
私は、このオブジェクトを解放などnull
にそれを設定するかもしれません別のスレッドthread2
持っている:私はこのように私のthread1
に各ステートメントの周りnull
にチェック入れなければならない場合
final Thread thread2 = new Thread(){
@Override
public void run() {
myObj.release();
myObj = null;
}
};
を私の質問はありますか?
final Thread thread1 = new Thread(){
@Override
public void run() {
if(myObj != null) {
myObj.pubFunc1();
}
if(myObj != null) {
myObj.pubFunc2();
}
if(myObj != null) {
myObj.pubFunc3();
}
}
};
またはすべてのステートメントの周りに1つのチェックだけで十分ですか?これから生じるかもしれない基本的な質問は、私たちがヌルチェックをしたオブジェクトの周りにロックがあるということですか?この状況をどう扱うか。このような状況に対応するためには、どのようなデザインパターンを使用すべきですか。
NOTE:私は3つのステートメントを必ず実行する必要はなく、3つのステートメントがアトミックユニットを形成することも望んでいません。私は、操作を実行しているオブジェクトがnullでない場合、操作を実行したいだけです。
オブジェクトが非同期にnullになる可能性がある場合は、オブジェクトをチェックする必要があります。また、 'synchronized'ブロックまたはメソッドでのみ' volatile'または読み書きする必要があります。これは「デザインパターン」ではなく、JLSから生じる常識です。 – EJP