スレッド アンセーフとは:
スレッド セーフとは、マルチスレッドがアクセスするときにロック メカニズムが使用され、スレッドがこのクラスの特定のデータにアクセスするとき、そのデータは保護されることを意味します。このスレッドが読み取りを完了するまで、他のスレッドはアクセスできません。読み取りが完了すると、他のスレッドが使用できるようになります。データの不整合やデータ汚染は発生しません。スレッドのセキュリティが確保されていないとは、データ アクセスが保護されていないことを意味し、複数のスレッドが連続してデータを変更し、取得されたデータがダーティ データになる可能性があります。
ArrayList は、要素を追加するときに
1 という 2 つのステップで完了します。これを保存します。 Items[Size] の位置にある要素;
2. Size の値を増やします。 (推奨学習: Java ビデオ チュートリアル )
シングルスレッド操作の場合、Size = 0 の場合、要素を追加した後、要素は位置 0 になり、Size= になります。 1;
マルチスレッド状況の場合、たとえばスレッドが 2 つある場合、スレッド A は最初に要素を位置 0 に格納します。ただし、この時点では、CPU はスレッド A を一時停止するようにスケジュールし、スレッド B は実行する機会を得ます。この時点では Size がまだ 0 に等しいため、スレッド B もこの ArrayList に要素を追加します (要素の追加には 2 つのステップが必要であり、スレッド A はステップ 1 のみを完了していると想定していることに注意してください)。そのため、スレッド B は要素も Stored at に追加します。場所0。その後、スレッド A とスレッド B の両方が実行を継続し、どちらも Size の値を増加させます。
さて、ArrayList の状況を見てみましょう。実際には要素は 1 つだけあり、位置 0 に格納されていますが、Size は 2 に等しいです。これは「スレッドが安全ではありません」です。
サンプル プログラム:
package test; importjava.util.ArrayList; import java.util.List; public class ArrayListInThread implements Runnable{ List<String> list1 = new ArrayList<String>();// not thread safe publicvoid run() { try { Thread.sleep((int)(Math.random() * 2)); } catch (InterruptedException e) { e.printStackTrace(); } list1.add(Thread.currentThread().getName()); } public static void main(String[] args) throws InterruptedException { ThreadGroup group = new ThreadGroup("mygroup"); ArrayListInThread t = new ArrayListInThread(); for (int i = 0; i < 10000; i++) { Thread th = new Thread(group, t,String.valueOf(i)); th.start(); } while (group.activeCount() > 0) { Thread.sleep(10); } System.out.println(); System.out.println(t.list1.size()); // it should be 10000 if thread safecollection is used. } }
スレッドのセキュリティ不安を解決するには?
1 つ: synchronized キーワードを使用します。これは誰もがよく知っているはずなので説明しません;
2 つ: Collections.synchronizedList() を使用します; 使用方法は次のとおりです。次のように:
作成するコードが次のとおりであるとします。 List
次に、このスレッド セーフティの問題を解決するために、次のように Collections.synchronizedList() を使用できます:
List<Map<String,Object>> data=Collections.synchronizedList(newArrayList<Map<String,Object>>());
他に何も変更はなく、使用されるメソッドは ArrayList とほぼ同じです。 API ドキュメントへ;
その他の Java 関連技術記事については、Java 開発チュートリアル 列にアクセスして学習してください。
以上がarraylist はスレッドセーフですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。