目次
1. スレッド セーフとは
2. アトミック性
2.1 競合状態
2.2 複合操作
3. ロック メカニズム
3.1 組み込みロック
3.2 再入可能
4. ロックを使用して状態を保護する
5. アクティビティとパフォーマンス
ホームページ Java &#&チュートリアル Java 並行プログラミングでスレッド セーフを実装する方法

Java 並行プログラミングでスレッド セーフを実装する方法

May 21, 2023 pm 03:14 PM
java

    1. スレッド セーフとは

    ランタイム環境やスレッドで使用される呼び出しメソッドに関係なく、複数のスレッドがクラスにアクセスする場合、実行が交互に実行され、メイン呼び出しコードで追加の同期や調整を行わなくても、このクラスが正しい動作を示すことができる場合、このクラスはスレッドセーフであると言われます。

    ステートレス オブジェクトは、Servlet のようにスレッドセーフである必要があります。

    2. アトミック性

    2.1 競合状態

    競合状態は、不適切な実行タイミングにより誤った結果が発生した場合に発生します。

    「まず確認してから実行」操作は、可能かつ効果的な観察結果に基づいて次のアクションを決定することです。例: 遅延初期化。

    if(instance == null) {
        instance = new SomeObject();
    }

    「読み取り-変更-書き込み」操作の結果の状態は、前の状態によって異なります。例: インクリメント操作。

    long count = 0;
    count++;

    2.2 複合操作

    アトミック操作とは、同じ状態にアクセスするすべての操作 (操作自体を含む) について、この操作がアトミックな (分割不可能な) 操作で実行されることを意味します。

    スレッドの安全性を確保するために、複合操作と呼ばれる、アトミックに実行する必要がある一連の操作が含まれています。

    インクリメンタル操作では、既存のスレッド セーフ クラスを使用して、スレッド セーフを確保できます。例:

    AtomicLong count = new AtomicLong(0);
    count.incrementAndGet();

    3. ロック メカニズム

    クラスに状態変数が 1 つだけある場合は、スレッド セーフな状態変数を使用してクラスのスレッド セーフを確保できます。クラスにさらに多くの状態がある場合、スレッドセーフな状態変数を追加するだけでは十分ではありません。状態の一貫性を確保するには、関連するすべての状態変数を 1 回のアトミック操作で更新する必要があります。

    3.1 組み込みロック

    Java は組み込みロックを提供します: 同期コード ブロック、これには以下が含まれます: ロックとしてのオブジェクト参照、このロックによって保護されるコードのブロックとしてのオブジェクト。

    キーワード synchronized で変更されたメソッドは、メソッド本体全体にわたる同期コード ブロックであり、同期コード ブロックのロックはメソッドが呼び出されるオブジェクトです。静的 synchronized メソッドは、Class オブジェクトをロックとして使用します。

    スレッドが同期されたコード ブロックに入ると、自動的にロックを取得し、スレッドが同期されたコード ブロックから出ると、自動的にロックを解放します。このロックを保持できるスレッドは最大 1 つであるため、同期されたコードはアトミックに実行されます。

    3.2 再入可能

    組み込みロックは再入可能です。つまり、ロックを取得する操作の粒度は呼び出しではなくスレッドです。スレッドがすでに保持しているロックを再取得しようとすると、リクエストも成功します。

    再入可能により、ロック動作のカプセル化がさらに改善され、オブジェクト指向の並行コードの開発が簡素化されます。

    public class Widget {
        public synchronized void doSomething() {
            //......
        }
    }
    public class LoggingWidget extends Widget {
        public synchronized void doSomething() {
            //......
            super.doSomething();//假如没有可重入的锁,该语句将产生死锁。
        }
    }

    4. ロックを使用して状態を保護する

    複数のスレッドによって同時にアクセスされる可能性がある変更可能な状態変数の場合、アクセスするときに同じロックを保持する必要があります。 、状態変数はこのロックによって保護されていると言われます。

    5. アクティビティとパフォーマンス

    ロックを粗く使用するとスレッドの安全性が確保されますが、次のようなパフォーマンスの問題やアクティビティの問題が発生する可能性があります。サーブレットの同時実行性を高め、同期コード ブロックを縮小することでスレッドの安全性を維持します。アトミックな操作であるべきものを複数の同期コード ブロックに分割せず、共有状態に影響を与えず、実行に時間がかかる操作を同期コードから分離するようにしてください。例:

    @ThreadSafe
    public class SynchronizedFactorizer implements Servlet {
        @GuardedBy("this") private BigInteger lastNumber;
        @GuardedBy("this") private BigInteger[] lastFactors;
    
        public synchronized void service(ServletRequest req,
                                         ServletResponse resp) {
            BigInteger i = extractFromRequest(req);
            if (i.equals(lastNumber))
                encodeIntoResponse(resp, lastFactors);
            else {
                BigInteger[] factors = factor(i);//因数分解计算
                lastNumber = i;
                lastFactors = factors;//存放上一次计算结果
                encodeIntoResponse(resp, factors);
            }
        }
    }

    以上がJava 並行プログラミングでスレッド セーフを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

    ホットAIツール

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Undresser.AI Undress

    Undresser.AI Undress

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

    AI Clothes Remover

    AI Clothes Remover

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

    Stock Market GPT

    Stock Market GPT

    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のClassPathにJARファイルを追加する方法は? JavaのClassPathにJARファイルを追加する方法は? Sep 21, 2025 am 05:09 AM

    -CPパラメーターを使用してJARをClassPathに追加して、JVMがjava-cplibrary.jarcom.example.mainなどの内部クラスとリソースをロードできるようにします。

    Javaでファイルを作成する方法 Javaでファイルを作成する方法 Sep 21, 2025 am 03:54 AM

    usefile.createNewfile()tocreatefileonlyifitdoes notexist、avolididingoverwriting;

    UC Browser_uc Browserの強制スケーリングWebページでWebページを強制する方法UCブラウザーによるスケーリングWebページ UC Browser_uc Browserの強制スケーリングWebページでWebページを強制する方法UCブラウザーによるスケーリングWebページ Sep 24, 2025 pm 04:54 PM

    まず、UCブラウザの組み込みスケーリング関数を有効にし、設定→[設定]→[フォントと版画]またはページスケーリングを参照し、プリセット比またはカスタムパーセンテージを選択します。第二に、2本の指でジェスチャーを開いたりピンチしたりすることにより、ページディスプレイサイズを強制することができます。スケーリングを制限するWebページの場合、Webサイトのデスクトップバージョンに制限のロックを解除することを要求できます。上級ユーザーは、アドレスバーでJavaScriptコードを実行して、より柔軟な強制スケーリング効果を実現することにより、ViewPort属性を変更することもできます。

    なぜリアルタイムシステムが決定論的応答を保証する必要があるのですか? なぜリアルタイムシステムが決定論的応答を保証する必要があるのですか? Sep 22, 2025 pm 04:03 PM

    リアルタイムシステムには、正確性が結果配信時間に依存するため、決定論的応答が必要です。ハードリアルタイムシステムには厳格な締め切りが必要であり、逃したことは災害につながりますが、ソフトリアルタイムは時折遅延を可能にします。スケジューリング、割り込み、キャッシュ、メモリ管理などの非決定的要因はタイミングに影響します。建設計画には、RTOの選択、WCET分析、リソース管理、ハードウェアの最適化、厳密なテストが含まれます。

    Javaで呼び出しメソッドの名前を取得する方法は? Javaで呼び出しメソッドの名前を取得する方法は? Sep 24, 2025 am 06:41 AM

    答えは、thread.currentthread()。getStackTrace()を使用してコールメソッド名を取得し、インデックス2から別のコールのソモメトッド名を取得することです。インデックス0はgetStackTraceであるため、1は現在のメソッドであり、2は発信者であり、2は例です。 インパクト。

    Microsoft Edge High CPU使用 Microsoft Edge High CPU使用 Sep 24, 2025 am 12:17 AM

    Edgeは、Chromium Kernelに基づいたリソースの消費量が多いため、マルチタブページ、プラグインランニング、Webサイトスクリプト、レンダリングメカニズムなどの要因のために、高いCPUを占有します。ソリューションには以下が含まれます。1。バックグラウンドの負担を軽減するための不要な拡張機能を閉じます。 2.「スリープタグ」関数を有効にして、アイドルタグリソースの使用を削減します。 3.バックグラウンドプロセスをクリーンアップし、関連する設定をレンダリングするGPUを閉じます。 4.ブラウザとシステムを更新して、互換性とパフォーマンスの最適化を確保します。

    Javaの例外をどのように処理しますか? Javaの例外をどのように処理しますか? Sep 23, 2025 am 04:44 AM

    Java例外処理トライキャッチブロックを介して例外をキャッチし、最後にブロックはリソースのクリーンアップを保証し、リソースでリソースを自動的に管理し、宣言の例外をスローし、特定の例外を扱うカスタム例外をスローし、例外を無視するのではなく、空の漁獲ブロックを避けるなどのベストプラクティスに従います。

    Javaのnullpointerexceptionを避けるためにオプションのクラスを使用する方法は? Javaのnullpointerexceptionを避けるためにオプションのクラスを使用する方法は? Sep 25, 2025 am 06:04 AM

    オプションのクラスは、nullポインターの例外を避けるために、nullの値を安全に処理するために使用されます。 1. null値を処理するためにoptional.ofnullableを使用してインスタンスを作成します。 2。例外を引き起こすための直接の呼び出しを避けるために、ISPResentまたはIfpresentセキュリティを介して値を確認してアクセスします。 3. orelseとorelsegetを使用してデフォルト値を提供するか、Orelsethrowを使用してカスタム例外をスローします。 4.マップおよびフィルターチェーンの操作を介して値を変換またはフィルタリングして、コードの読みやすさと堅牢性を向上させます。

    See all articles