ホームページ  >  記事  >  Java  >  Java 並行プログラミングでロックとシンクロナイザーを使用するにはどうすればよいですか?

Java 並行プログラミングでロックとシンクロナイザーを使用するにはどうすればよいですか?

PHPz
PHPzオリジナル
2024-05-08 22:06:02872ブラウズ

Java は、共有リソースへのアクセスを管理するためのロックとシンクロナイザーを提供します。 ReentrantLock などのロックでは、一度に 1 つのスレッドのみがクリティカル セクションにアクセスできますが、Semaphore や CountDownLatch などのシンクロナイザーでは、リソースに同時にアクセスするスレッドの数を制限したり、すべてのスレッドがタスクを完了するのを待機したりするなど、より柔軟な同時実行制御が提供されます。 。これらのメカニズムを使用すると、データ競合を効果的に回避し、アプリケーションのパフォーマンスを向上させることができます。

Java 并发编程中如何使用锁和同步器?

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 サイトの他の関連記事を参照してください。

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