Java并发编程:Semaphore详解与实战

需积分: 0 0 下载量 131 浏览量 更新于2024-08-05 收藏 589KB PDF 举报
本文主要介绍了并发编程中的两个工具——Semaphore和CountDownLatch,并详细阐述了它们的原理和应用场景。 Semaphore(信号量)是一种并发控制机制,它允许特定数量的线程访问共享资源。Semaphore的主要功能是限制同时访问某个资源的线程数量。在Java中,Semaphore提供了两种构造方法: 1. `Semaphore(int permits)`:创建一个信号量,指定初始的许可数量。 2. `Semaphore(int permits, boolean fair)`:除了指定许可数量外,还可以设置公平性。如果fair参数为true,线程将按照等待时间的顺序获取许可,否则遵循非公平策略,即线程获取许可时可能不按等待顺序。 Semaphore的核心方法有: 1. `acquire()`:阻塞当前线程,直到获取到一个许可。如果没有许可,则线程会被挂起,直到其他线程释放许可。 2. `release()`:释放一个许可,允许其他线程继续执行。当许可数量为0时,调用`release()`会唤醒被`acquire()`阻塞的线程。 3. `tryAcquire(long timeout, TimeUnit unit)`:尝试在指定时间内获取许可,如果在指定时间内无法获取,则返回false。 Semaphore的一个常见应用场景是资源访问控制,例如限制同时访问数据库连接池的线程数量,或者用于服务限流,防止系统过载。 接下来,我们讨论另一个并发工具——CountDownLatch。CountDownLatch是一个计数器,初始化为一个正整数,每次调用`countDown()`方法,计数器减1,当计数器归零时,所有等待在`await()`方法上的线程会被唤醒。这常用于多线程协作,确保所有线程完成特定任务后,再继续执行后续操作。 CountDownLatch的基本使用包括: 1. 初始化CountDownLatch:`CountDownLatch countDownLatch = new CountDownLatch(n);`,其中n是计数器的初始值。 2. 在需要等待的线程中调用`countDownLatch.countDown();`,每完成一个任务就减少一次计数。 3. 在主线程或其他需要等待所有任务完成的地方调用`countDownLatch.await();`,这会使主线程进入等待状态,直到计数器归零。 举例来说,如果有5个子任务,我们可以创建一个`CountDownLatch(5)`,每个子任务执行完毕后调用`countDown()`,主线程调用`await()`等待所有子任务完成后才继续执行。 总结起来,Semaphore和CountDownLatch都是Java并发编程中的重要工具,它们帮助开发者有效地管理和协调并发线程,确保程序的正确性和高效运行。Semaphore通过限制并发线程数来控制资源访问,而CountDownLatch则提供了一种同步机制,使得线程可以等待其他线程完成任务后再继续执行。合理使用这两个工具,可以极大地提高多线程环境下的程序设计能力。