2016-04-14 17 views

答えて

1

はい、完全に有効ですが、これを行うことでどのように達成できますか?また、スレッドは、オブジェクト参照を保持する変数ではなくオブジェクトインスタンスにゲインロックを設定しますしたがって、listを他のインスタンスに再割り当てしても、現在のスレッドはすでに前のオブジェクトに対してロックを取得しています。

もっと具体的には、listに値val1が割り当てられているとします。 (彼らは参照list上のインスタンスval1ないでロックを待っているので)次にthread1は(変数listによって指される)val1のロックをとり、現在、他のスレッドでもthread1かかわらlistを再インスタンス化したval1のロックを取ることができません。

listを​​ブロック内に戻すのではなく、ブロックを消去しておく方がよいでしょう。

+0

このリストを別のリストで更新したいと思います。このリストをクリアして、すべてを追加する方が良いでしょうか?このリストには他のスレッドが反復しています。 –

+0

@AkashMahajanはい、理想的にはアプローチでなければなりません。 –

5

あなたは

synchronized (list) 

を書くとき、ロックがオブジェクト、ない変数/フィールドlistです。

あなたは

synchronized (list) { 
    list = new ArrayList<>(); 
} 

を行う場合は、新しいオブジェクトを作成し、変数/フィールドを再割り当てしている - しかし、あなたがロックを変更していない - ロックはまだそれが前にいた同じオブジェクトです。