ホームページ Java &#&チュートリアル スレッド セーフに関する Java コレクションのクラス

スレッド セーフに関する Java コレクションのクラス

Jan 23, 2017 pm 04:42 PM

Java コレクション内のクラスはスレッド セーフです

スレッド セーフ クラス

コレクション フレームワークでは、一部のクラスはスレッド セーフであり、これらはすべて jdk1.1 に表示されます。 jdk1.2以降、多くの非スレッドセーフクラスが登場しました。 これらのスレッドセーフな同期クラスは次のとおりです:

vector: arraylist よりも 1 つ多くの同期メカニズム (スレッド セーフ) があり、効率が低いため、使用は推奨されません。 Web アプリケーション、特にフロントエンド ページでは、効率 (ページの応答速度) が優先されることがよくあります。

statck: スタッククラス、先入れ後出力

hashtable: ハッシュマップよりもスレッドセーフ

enumeration: 列挙、イテレータと同等

これらに加えて、他のクラスとインターフェースは非スレッドセーフです。

スレッドセーフ クラスのメソッドは同期されており、一度に 1 つだけアクセスできます。重量物なので効率が低いです。

その他:

1. ハッシュテーブルとハッシュマップの違い

ハッシュテーブルはスレッドセーフです。つまり、ハッシュテーブルメソッドは同期メカニズムを提供しません。つまり、同期メカニズムを提供しません。 hashtable では null 値の挿入は許可されません。

2. 複数のスレッドがコレクションを同時に変更する場合はどうなりますか

古い Vector/Hashtable クラスを使用してください

StringBuffer はスレッド セーフですが、StringBuilder はスレッド セーフではありません。安全性と安全性について深く理解していないと、StringBuffer のすべての操作がスレッドセーフであるかのような錯覚を起こしやすくなります。ただし、Java によって保証されるスレッド安全性は、そのメソッドの実行が排他的であることを意味します。オブジェクト自体を複数回呼び出しても、安全です。以下の例を見てください。 StringBufferTest には、展開に使用されるデータ メンバーの内容があります。ただし、複数の追加の組み合わせはスレッド セーフではありません。ただし、キーワード synchronized をログおよび getContest メソッドに追加すると、結果が非​​常に整理されます。StringBuider に変更するか、途中で追加する場合でも、これに基づいて動作する他のスレッドに道を譲ることになります。 StringBuilder と StringBuffer はまったく同じであり、マルチスレッドとシングルスレッドの問題です。スレッドが同じ StringBuffer の append メソッドを呼び出した場合、それがスレッド セーフであるかどうかとは関係がありません。追加された一連の文字列が混乱するという結果にならない限り、それはスレッド セーフではないことを意味します。スレッド セーフとは、常に 1 つのスレッドだけが重要なリソースにアクセスできることを意味します。スレッド セーフとは、一連の操作が同期されていることを意味するのではなく、特定のメソッドを実行するときに他のスレッドが変更できないことを意味します。クラスがスレッドセーフであるかどうかは、複数のスレッドが同時に実行されていることに依存し、これらのスレッドは特定のメソッドを同時に実行する可能性があります。ただし、各操作の結果はシングルスレッド実行の場合と同じであるため、スレッドセーフであると言えます。ログ メソッドはロックされていないため、追加ロックが解放された後、誰もが CPU の実行フラグメントを取得する可能性があります。

ただし、マルチスレッドの安全性を誤解しないでください:

public class StringBufferTest {
  private StringBuffer contents = new StringBuffer();
  public void log(String message){
   contents.append(System.currentTimeMillis());
   contents.append("; ");
   contents.append(Thread.currentThread().getName());
   for(int i=0;i<10000;i++){
    contents.append(i);  
     contents.append(message);  //append本身是线程安全的,修改contents时,其它线程无法访问。
     contents.append("\n");
   }
   contents.append("\n\n");
  }
  public void getContents(){
   System.out.println(contents);
  }
}
 
class RunThread extends Thread{
  String message;
  StringBufferTest buffer;
  public RunThread(StringBufferTest buffer, String message){
   this.buffer = buffer;
   this.message = message;
  }
  public void run(){
   while(true){
     buffer.log(message);
     buffer.getContents();
   }
  }
  public static void main(String[] args) {
   StringBufferTest ss = new StringBufferTest();
   new RunThread(ss, "you").start();
   new RunThread(ss, "me").start();
   new RunThread(ss, "she").start();
  }
}
ログイン後にコピー

このコードは完全にスレッドセーフです。メソッド内で定義された変数は、各スレッドが入るときにこのローカル変数を作成します。スレッドの安全性の問題は関係ありません。一般に、システム セキュリティに関連する変数はメンバー変数です。stringBuffer 自体の内部実装はサイトセーフです。スレッド セーフとは、クラス自体が提供する関数が安全であることを意味します。つまり、文字列を挿入する場合、この文字列の挿入は安全ですが、2 つの文字列を挿入する必要があり、その間に他の挿入エラーが発生しても、2 つの文字列の順序を決定する必要があります。はい、独自のコードに問題があります。

読んでいただきありがとうございます、皆さんのお役に立てれば幸いです、このサイトをサポートしていただきありがとうございます!

Java コレクションのクラスに関するスレッド セーフティ関連の記事をさらに詳しく知りたい場合は、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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

会社のセキュリティソフトウェアはアプリケーションの実行に失敗していますか?それをトラブルシューティングと解決する方法は? 会社のセキュリティソフトウェアはアプリケーションの実行に失敗していますか?それをトラブルシューティングと解決する方法は? Apr 19, 2025 pm 04:51 PM

一部のアプリケーションが適切に機能しないようにする会社のセキュリティソフトウェアのトラブルシューティングとソリューション。多くの企業は、内部ネットワークセキュリティを確保するためにセキュリティソフトウェアを展開します。 ...

エンティティクラス変数名をエレガントに取得して、データベースクエリ条件を構築する方法は? エンティティクラス変数名をエレガントに取得して、データベースクエリ条件を構築する方法は? Apr 19, 2025 pm 11:42 PM

データベース操作にMyBatis-Plusまたはその他のORMフレームワークを使用する場合、エンティティクラスの属性名に基づいてクエリ条件を構築する必要があることがよくあります。あなたが毎回手動で...

MapsTructを使用したシステムドッキングのフィールドマッピングの問題を簡素化する方法は? MapsTructを使用したシステムドッキングのフィールドマッピングの問題を簡素化する方法は? Apr 19, 2025 pm 06:21 PM

システムドッキングでのフィールドマッピング処理は、システムドッキングを実行する際に難しい問題に遭遇することがよくあります。システムのインターフェイスフィールドを効果的にマッピングする方法A ...

Intellijのアイデアは、ログを出力せずにSpring Bootプロジェクトのポート番号をどのように識別しますか? Intellijのアイデアは、ログを出力せずにSpring Bootプロジェクトのポート番号をどのように識別しますか? Apr 19, 2025 pm 11:45 PM

intellijideaultimatiateバージョンを使用してスプリングを開始します...

データベースクエリにTKMYBATISを使用するときに、エンティティクラスの変数名の構築クエリ条件をエレガントに取得する方法は? データベースクエリにTKMYBATISを使用するときに、エンティティクラスの変数名の構築クエリ条件をエレガントに取得する方法は? Apr 19, 2025 pm 09:51 PM

データベースクエリにTKMYBATISを使用する場合、クエリ条件を構築するためにエンティティクラスの変数名を優雅に取得する方法は一般的な問題です。この記事はピン留めします...

名前を数値に変換してソートを実装し、グループの一貫性を維持するにはどうすればよいですか? 名前を数値に変換してソートを実装し、グループの一貫性を維持するにはどうすればよいですか? Apr 19, 2025 pm 11:30 PM

多くのアプリケーションシナリオでソートを実装するために名前を数値に変換するソリューションでは、ユーザーはグループ、特に1つでソートする必要がある場合があります...

Javaオブジェクトを配列に安全に変換する方法は? Javaオブジェクトを配列に安全に変換する方法は? Apr 19, 2025 pm 11:33 PM

Javaオブジェクトと配列の変換:リスクの詳細な議論と鋳造タイプ変換の正しい方法多くのJava初心者は、オブジェクトのアレイへの変換に遭遇します...

eコマースプラットフォームSKUおよびSPUデータベースデザイン:ユーザー定義の属性と原因のない製品の両方を考慮する方法は? eコマースプラットフォームSKUおよびSPUデータベースデザイン:ユーザー定義の属性と原因のない製品の両方を考慮する方法は? Apr 19, 2025 pm 11:27 PM

eコマースプラットフォーム上のSKUおよびSPUテーブルの設計の詳細な説明この記事では、eコマースプラットフォームでのSKUとSPUのデータベース設計の問題、特にユーザー定義の販売を扱う方法について説明します。

See all articles