インターネットの継続的な発展に伴い、Java 言語は開発者にとって重要なツールになりました。 Java 開発では、並行プログラミングが必要となる状況がますます増えています。このため、Java 並行プログラミングの基本知識を習得することが非常に必要です。
以下では、Java 並行プログラミングの基本知識を詳しく紹介します。
スレッドは、オペレーティング システムが操作のスケジューリングを実行できる最小単位、つまり実行パスです。 Java では、マルチスレッドは同時プログラミングを実装する一般的な手段です。
Java では、Thread クラスを使用して新しいスレッドを作成し、開始します。スレッドを開始するときに、Thread クラスの run() メソッドをオーバーライドすることで、スレッドによって実行されるタスクを指定できます。例:
class RunnableThread implements Runnable { public void run() { // 线程执行任务 } } public class Main { public static void main(String[] args) { RunnableThread runnable = new RunnableThread(); Thread thread = new Thread(runnable); thread.start(); } }
上記のコードでは、Runnable インターフェイスを実装する RunnableThread クラスが作成され、main 関数で新しいスレッドが作成されて開始されます。新しいスレッドのタスクは、オーバーライドされた run() メソッドによって定義されます。
マルチスレッド プログラミングでは、共有リソースが関係する状況では、データの一貫性と正確性を確保するために同期が必要です。 Java には、同期ロックを実装するための synchronized キーワードが用意されています。一般的な同期メソッドをいくつか次に示します。
同期メソッドとは、メソッド宣言で synchronized キーワードを使用してメソッドを同期メソッドにすることを指します。以下に示すように:
public synchronized void method(){ // 同步内容 }
上記のコードのメソッド() メソッドは同期メソッドであり、他のスレッドはメソッドの完了後にのみ実行を許可されます。
メソッド宣言で synchronized キーワードを使用することに加えて、同期コード ブロックを使用してスレッド間の同期を実現することもできます。以下は、同期コード ブロックの使用例です。
public void method(){ synchronized (this){ // 同步代码块 } }
上記のコードでは、同期コード ブロックが使用されており、括弧内はメソッドが属するオブジェクトのロックを示しています。
Java の volatile キーワードは、スレッドの可視性とある程度の順序性を保証できる軽量の同期メカニズムです。変数が volatile に変更されると、変数が読み取られるたびに最新の値がメモリから読み取られます。例:
public volatile boolean flag = false;
上記のコードのフラグ変数は volatile 型として宣言されており、その値が複数のスレッドによって変更される可能性があることを示しています。マルチスレッド環境では、 volatile キーワードを使用すると、変数へのスレッド アクセスの一貫性を確保できます。
スレッド プールは、Java の非常に実用的なマルチスレッド プログラミング ツールであり、スレッドの作成と破棄のコストを削減し、スレッドを効果的に制御できます。スレッド数: 過剰なスレッド数によるシステム リソースの浪費を防ぐための制御。 Java では、スレッド プールは Executor フレームワークを通じて提供されます。
以下は、Executor フレームワークを使用してスレッド プールを作成する例です。
ExecutorService executor = Executors.newFixedThreadPool(5); for(int i = 0; i < 10; i++){ executor.execute(new RunnableThread()); } executor.shutdown();
上記のコードでは、スレッド数が 5 に固定されたスレッド プールが作成され、その後、 10 個のタスクがスレッド プールに送信されます。最後に、shutdown() メソッドを使用してスレッド プールを閉じます。
Java は、ConcurrentHashMap、ConcurrentLinkedQueue など、多くのスレッドセーフなコレクション クラスを提供します。これらのコレクション クラスは、マルチスレッド環境で効率的かつ安全なデータ操作を提供できます。
以下は ConcurrentHashMap の使用例です:
ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>(); map.put("key1", "value1"); map.put("key2", "value2"); for(Map.Entry<String, String> entry : map.entrySet()){ System.out.println(entry.getKey() + ":" + entry.getValue()); }
上記のコードでは、スレッドセーフな ConcurrentHashMap が作成され、2 つのキーと値のペアが挿入され、マップが走査されます。
Java は、synchronized、ReentrantLock など、さまざまなロック実装メソッドを提供します。マルチスレッド環境では、ロックはスレッドの同期実行を保証する重要なメカニズムです。
以下は、ReentrantLock を使用して同期ロックを実装する例です:
ReentrantLock lock = new ReentrantLock(); lock.lock(); try { // 同步代码块 } finally { lock.unlock(); }
上記のコードでは、ReentrantLock を使用してロックを作成し、ロックする前に lock() メソッドを通じてロックを取得します。実行が完了したら、unlock() メソッドを使用してロックを解放します。
概要
Java 並行プログラミングは複雑かつ重要なテクノロジであり、その基本知識を習得することは、効率的で安全なマルチスレッド プログラムを作成する上で非常に重要です。この記事では、Java 並行プログラミングにおけるスレッド、同期、揮発性、スレッド プール、並行コレクション、およびロックの概要を説明します。読者は Java 並行プログラミングについてより深く理解できると思います。
以上がJava 同時プログラミングの基本的な知識の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。