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中文网其他相关文章!