ホームページ > Java > &#&チュートリアル > arraylist はスレッドセーフですか?

arraylist はスレッドセーフですか?

(*-*)浩
リリース: 2019-06-05 11:58:43
オリジナル
11097 人が閲覧しました

スレッド アンセーフとは:

スレッド セーフとは、マルチスレッドがアクセスするときにロック メカニズムが使用され、スレッドがこのクラスの特定のデータにアクセスするとき、そのデータは保護されることを意味します。このスレッドが読み取りを完了するまで、他のスレッドはアクセスできません。読み取りが完了すると、他のスレッドが使用できるようになります。データの不整合やデータ汚染は発生しません。スレッドのセキュリティが確保されていないとは、データ アクセスが保護されていないことを意味し、複数のスレッドが連続してデータを変更し、取得されたデータがダーティ データになる可能性があります。

arraylist はスレッドセーフですか?

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>data=new ArrayList>();

次に、このスレッド セーフティの問題を解決するために、次のように Collections.synchronizedList() を使用できます:

List<Map<String,Object>> data=Collections.synchronizedList(newArrayList<Map<String,Object>>());
ログイン後にコピー

他に何も変更はなく、使用されるメソッドは ArrayList とほぼ同じです。 API ドキュメントへ;

その他の Java 関連技術記事については、Java 開発チュートリアル 列にアクセスして学習してください。

以上がarraylist はスレッドセーフですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート