-2

プログラムに2つのスレッドとArrayListがあります。スレッドからリストにアクセスしたい。

public void run() {
...
arraylist.add(myObj);
...
}

public void run() {
...
arraylist.remove(myObj);
...
}

各スレッドの同期を試してみました。

 synchronized (arraylist) 
 {  
    //add or remove
 } 

しかし、それは「非最終フィールドの同期」と言いました。

4

2 に答える 2

1

非最終フィールドの同期は、 無視しても問題がない警告にすぎません。arraylistがコンストラクターでのみ割り当てられている場合は、として宣言しfinalて警告を取り除くことができます。

removeメソッドは本質的にスレッドセーフではないため、リストで同期する必要があります(削除する要素を検索しているときに、1つのスレッドがリストを変更する場合があります)。 remove

于 2013-03-18T13:45:18.420 に答える
0

arraylist同期なしで他の操作があるようです。

Synchronization of non-final fieldこの警告は、コードのブロックを正しく同期するスレッドが多数ある場合に、同じオブジェクトインスタンスで同期する必要がある場合にコンパイラによって表示されます。

于 2013-03-18T13:43:21.010 に答える