Java は、共有リソースへのアクセスを管理するためのロックとシンクロナイザーを提供します。 ReentrantLock などのロックでは、一度に 1 つのスレッドのみがクリティカル セクションにアクセスできますが、Semaphore や CountDownLatch などのシンクロナイザーでは、リソースに同時にアクセスするスレッドの数を制限したり、すべてのスレッドがタスクを完了するのを待機したりするなど、より柔軟な同時実行制御が提供されます。 。これらのメカニズムを使用すると、データ競合を効果的に回避し、アプリケーションのパフォーマンスを向上させることができます。
Java 並行プログラミングのロックとシンクロナイザー
並行プログラミングでは、複数のスレッドを同時に実行できますが、共有リソースへのアクセスを管理するメカニズムが必要です。 Java は、これを実現するためにさまざまなロックとシンクロナイザーを提供します。
ロック
ロックでは、一度に 1 つのスレッドのみがクリティカル セクション (共有リソースの変更された部分) にアクセスできます。一般的に使用されるロックは次のとおりです:
// 创建一个 ReentrantLock Lock lock = new ReentrantLock(); // 获取锁 lock.lock(); // 访问临界区 // ... // 释放锁 lock.unlock();
Synchronizer
シンクロナイザーはロックよりも高度であり、より柔軟な同時実行制御を提供します。一般的に使用されるシンクロナイザーは次のとおりです。
セマフォ
セマフォは、同時にリソースにアクセスできるスレッドの数を制限します。
// 创建一个 Semaphore,允许最多 3 个线程同时访问 Semaphore semaphore = new Semaphore(3); // 申请许可证 semaphore.acquire(); // 访问临界区 // ... // 释放许可证 semaphore.release();
CountDownLatch
CountDownLatch は、すべてのスレッドがタスクを完了するまで待ってから続行します。
// 创建一个 CountDownLatch,等待 10 个线程完成 CountDownLatch latch = new CountDownLatch(10); // 10 个线程执行任务 // ... // 每个线程完成后,计数器减一 latch.countDown(); // 主线程等待所有线程完成 latch.await();
実際的なケース
以下は、セマフォを使用して同時に口座にアクセスするスレッドの数を制限する銀行口座操作の実際的なケースです:
class BankAccount { private Semaphore semaphore = new Semaphore(1); private double balance; public void deposit(double amount) { try { semaphore.acquire(); balance += amount; } finally { semaphore.release(); } } public void withdraw(double amount) { try { semaphore.acquire(); balance -= amount; } finally { semaphore.release(); } } }
結論
ロックとシンクロナイザーは、次の目的で使用されます。 Java 並行プログラミングの強力なツールで共有リソース アクセスを管理します。これらのメカニズムを慎重に使用することで、データ競合を効果的に回避し、プログラムのパフォーマンスを向上させることができます。
以上がJava 並行プログラミングでロックとシンクロナイザーを使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。