首頁  >  文章  >  Java  >  Java 並發程式設計如何使用鎖定和同步器?

Java 並發程式設計如何使用鎖定和同步器?

PHPz
PHPz原創
2024-05-08 22:06:02814瀏覽

Java 提供鎖定和同步器來管理共用資源的存取。鎖如 ReentrantLock 允許一次僅一個執行緒存取臨界區,而同步器如 Semaphore 和 CountDownLatch 提供更靈活的並發控制,例如限制同時存取資源的執行緒數或等待所有執行緒完成任務。使用這些機制可以有效避免數據競爭並提高應用程式效能。

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

Java 並發程式設計中的鎖定與同步器

並發程式設計允許多個執行緒同時執行,但需要機制來管理對共享資源的存取。 Java 提供了各種鎖定和同步器來實現這一點。

鎖定

鎖定允許一次只有一個執行緒存取臨界區(共享資源的修改部分)。常用的鎖有:

// 创建一个 ReentrantLock
Lock lock = new ReentrantLock();

// 获取锁
lock.lock();

// 访问临界区
// ...

// 释放锁
lock.unlock();

同步器

同步器比鎖定更高級,提供了更靈活的並發控制。常用的同步器有:

Semaphore

Semaphore 限制同時可以存取資源的執行緒數。

// 创建一个 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();

實戰案例

以下是一個銀行帳戶操作的實戰案例,使用Semaphore 限制同時存取帳戶的執行緒數:

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn