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