Java でのスレッド同期と相互排他的リソースの問題を解決する方法
Java でのスレッド同期と相互排他リソースの問題を解決する方法
はじめに:
マルチスレッド プログラミングでは、スレッド同期と相互排他の問題が発生します。独占的なリソースは非常に重要なトピックの 1 つです。複数のスレッドが共有リソースにアクセスする場合、効果的な同期が実行されないと、データの不整合、競合状態、デッドロックなどの問題が発生する可能性があります。これらの問題を解決するために、Java にはさまざまな仕組みが用意されていますが、この記事では、Java におけるスレッド同期とリソースの相互排他の問題を解決する方法と、具体的なコード例を詳しく紹介します。
1. synchronized キーワード
synchronized キーワードは、スレッド同期の問題を解決する Java の最も基本的なメカニズムです。メソッドとコード ブロックを変更して、変更されたメソッドまたはコード ブロックに同時に 1 つのスレッドだけが入力できるようにすることができます。
サンプル コード:
public class SynchronizedExample { private int count = 0; public synchronized void increment() { count++; } public synchronized int getCount() { return count; } }
上記のコードは、カウンターを含む SynchronizedExample クラスを定義します。 synchronized キーワードは、increment メソッドと getCount メソッドの両方に追加され、1 つのスレッドのみがこれら 2 つのメソッドに同時に入ることができるようになります。
2. Lock インターフェイス
synchronized キーワードに加えて、Java はスレッド同期の問題を解決する別のメカニズムとして Lock インターフェイスも提供します。 Lock インターフェースの lock() メソッドはロックを取得し、unlock() メソッドはロックを解放します。 synchronized キーワードと比較して、Lock インターフェイスはより柔軟な制御機能を備えており、より複雑な同期操作を実装できます。
サンプル コード:
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class LockExample { private int count = 0; private Lock lock = new ReentrantLock(); public void increment() { lock.lock(); try { count++; } finally { lock.unlock(); } } public int getCount() { return count; } }
上記のコードでは、Lock インターフェイスを使用して、カウンターを含む LockExample クラスを実装しています。 increment メソッドでは、最初に lock() メソッドを呼び出してロックを取得し、次にカウンタのインクリメント操作を実行し、最後に lock() メソッドを呼び出してロックを解放します。これにより、同時に 1 つのスレッドだけがカウンター インクリメント操作を実行できるようになります。
3. Volatile キーワード
volatile キーワードは、Java で共有変数を変更するために使用されるキーワードで、可視性と順序性を保証できますが、原子性は保証できません。スレッドが volatile 変数を変更すると、他のスレッドはその変更をすぐに確認できます。
サンプル コード:
public class VolatileExample { private volatile int count = 0; public void increment() { count++; } public int getCount() { return count; } }
上記のコードでは、count 変数が volatile キーワードで変更されています。これにより、1 つのスレッドがカウントを変更した後、他のスレッドがその変更をすぐに確認できるようになります。
結論:
Java には、スレッドの同期と相互排他的なリソースの問題を解決するためのメカニズムが多数あります。この記事では、synchronized キーワード、Lock インターフェイス、volatile キーワードという 3 つの一般的なメカニズムを紹介します。実際の開発では、スレッドの正しい同期と相互排他的アクセスを保証するために、特定の状況に基づいて適切なメカニズムを選択する必要があります。
以上がJava でのスレッド同期と相互排他的リソースの問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











この記事では、2025年の上位4つのJavaScriptフレームワーク(React、Angular、Vue、Svelte)を分析し、パフォーマンス、スケーラビリティ、将来の見通しを比較します。 強力なコミュニティと生態系のためにすべてが支配的なままですが、彼らの相対的なポップ

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します

node.js 20は、V8エンジンの改善、特により速いガベージコレクションとI/Oを介してパフォーマンスを大幅に向上させます。 新機能には、より良いWebセンブリのサポートと洗練されたデバッグツール、開発者の生産性とアプリケーション速度の向上が含まれます。

この記事では、リモートコードの実行を可能にする重大な欠陥であるSnakeyamlのCVE-2022-1471の脆弱性について説明します。 Snakeyaml 1.33以降のSpring Bootアプリケーションをアップグレードする方法は、このリスクを軽減する方法を詳述し、その依存関係のアップデートを強調しています

大規模な分析データセットのオープンテーブル形式であるIcebergは、データの湖のパフォーマンスとスケーラビリティを向上させます。 内部メタデータ管理を通じて、寄木細工/ORCの制限に対処し、効率的なスキーマの進化、タイムトラベル、同時wを可能にします

この記事では、Lambda式、Streams API、メソッド参照、およびオプションを使用して、機能プログラミングをJavaに統合することを調べます。 それは、簡潔さと不変性を通じてコードの読みやすさと保守性の改善などの利点を強調しています

この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。
