ホームページ Java &#&チュートリアル COW メカニズムと関連クラスの紹介

COW メカニズムと関連クラスの紹介

Mar 02, 2019 pm 02:28 PM
java

この記事の内容は COW の仕組みと関連クラスの紹介であり、一定の参考価値がありますので、困っている方は参考にしていただければ幸いです。

COW メカニズムには関連クラスがあります

Vector と SynchronizedList

ArrayList は Vector の置き換えに使用され、Vector はスレッドセーフなコンテナーであることがわかっています。コンテナを安全にするために、ほぼすべてのメソッド宣言に synchronized キーワードが追加されるからです。 Collections.synchronizedList(new ArrayList()) を使用して ArrayList をスレッドセーフにする場合、ほぼすべてのメソッドで synchronized キーワードが追加されますが、これはメソッドの宣言ではなくメソッド内部で追加されます。

Vector または SynchronizedList のマルチスレッド for ループ反復では、削除および取得操作を実行すると、配列添字エラー例外が発生します。

JDK5 以降、Java では、コレクションの走査に for-each (反復子) を使用することが推奨されています。利点は、それが簡単で、配列インデックスの境界値が 1 回だけ計算されることです。 for-each (イテレータ) を使用して上記の操作を実行すると、ConcurrentModificationException がスローされます。

上記の問題を完全に解決したい場合は、トラバースする前にロックを追加できます:

コンテナをトラバースするときにロックを追加する必要があります。遅い? 。確かにかなり遅いです。ロックの粒度が大きすぎるためです。

CopyOnWriteArrayList は同期 List の代替であり、CopyOnWriteArraySet は同期 Set の代替です。

Hashtable と Vector はロックの粒度が大きい (メソッド宣言で直接同期を使用する) ConcurrentHashMap と CopyOnWriteArrayList はロックの粒度が小さい (スレッド セーフを実現するためにさまざまなメソッドを使用する。たとえば、ConcurrentHashMap は cas lock 、 volatile を使用することがわかっています) JUC のスレッド セーフ コンテナは、トラバーサル中に ConcurrentModificationException をスローしません。したがって、一般的に言えば、古い A 世代を使用する代わりに、JUC パッケージで提供されるスレッド セーフ コンテナを使用します。スレッドセーフなコンテナーの。

CopyOnWriteArrayList の実装原理

CopyOnWriteArrayList は (ArrayList に対して) スレッドセーフなコンテナーであり、最下層は配列をコピーすることによって実装されます。 CopyOnWriteArrayList はトラバース時に ConcurrentModificationException をスローせず、トラバース中に追加の要素をロックする必要はありません。要素は null にすることができます

/** 可重入锁对象 */
    final transient ReentrantLock lock = new ReentrantLock();
    /** CopyOnWriteArrayList底层由数组实现,volatile修饰 */
    private transient volatile Object[] array;

    final Object[] getArray() {
        return array;
    }
    final void setArray(Object[] a) {
        array = a;
    }
    // 初始化CopyOnWriteArrayList相当于初始化数组
    public CopyOnWriteArrayList() {
        setArray(new Object[0]);
    }
ログイン後にコピー

CopyOnWriteArrayList の最下層は配列であり、ロックは ReentrantLock によって行われます。

コードから次のことがわかります。add()、set()、remove()、および新しい配列のコピー時にロックされ、新しい配列で加算操作が完了し、配列が新しい配列をポイントします。配列 、ついにロックが解除されました。変更する場合、新しい配列がコピーされ、新しい配列内で変更操作が完了し、最後に新しい配列が配列変数によってポイントされます。書き込み用にロックされ、読み取り用にロックされない

CopyOnWriteArrayList の欠点

メモリ使用量: CopyOnWriteArrayList がデータの追加、削除、変更を頻繁に行い、add()、set() を頻繁に実行する場合、および Remove() は、より多くのメモリを消費します。

add()、set()、remove() などの各追加、削除、変更操作では配列をコピーする必要があることがわかっているためです。

データの一貫性: CopyOnWrite コンテナはデータの最終的な一貫性のみを保証できますが、データのリアルタイムの一貫性は保証できません。

上記の例からもわかります。たとえば、スレッド A は CopyOnWriteArrayList コンテナーのデータを反復しています。スレッド B は、スレッド A の反復ギャップ中に CopyOnWriteArrayList 部分のデータを変更しました (setArray() が呼び出されました)。ただし、スレッド A は元のデータを反復処理します。

以上がCOW メカニズムと関連クラスの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの平方根 Javaの平方根 Aug 30, 2024 pm 04:26 PM

Java の平方根のガイド。ここでは、Java で平方根がどのように機能するかを、例とそのコード実装をそれぞれ示して説明します。

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

Javaのアームストロング数 Javaのアームストロング数 Aug 30, 2024 pm 04:26 PM

Java のアームストロング番号に関するガイド。ここでは、Java でのアームストロング数の概要とコードの一部について説明します。

Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

See all articles