Java 5.0里新加了4个协调线程间进程的同步装置,它们分别是Semaphore, CountDownLatch, CyclicBarrier和Exchanger,本例主要介绍Semaphore,Semaphore是用来管理一个资源池的工具,可以看成是个通行证
在Java多线程编程中,线程的并发控制是非常关键的一部分,它确保多个线程能够协同工作并有效地访问共享资源。Java 5.0引入了四个新的同步工具类,它们是Semaphore、CountDownLatch、CyclicBarrier和Exchanger,用于解决线程间的同步问题。本篇将重点讲解Semaphore类。
Semaphore,顾名思义,就像是一个信号灯或通行证,用来管理一组有限的资源。在Java中,Semaphore类提供了对并发线程进行计数的许可管理,允许我们限制同时访问特定资源的线程数量。这在处理并发任务时非常有用,例如限制数据库连接池的大小、限制同时访问硬件设备的数量或者限制某个服务的并发请求。
Semaphore初始化时需要指定一个非负整数,表示可用的许可证数量。当一个线程需要访问资源时,它需要获取一个许可证,如果没有可用的许可证,线程将会被阻塞并等待。一旦线程完成其任务,它会释放一个许可证,使得其他等待的线程有机会获取资源。Semaphore提供了`acquire()`方法用于获取许可证,`release()`方法用于释放许可证。
在给出的代码示例中,创建了一个Semaphore对象,初始化为2,意味着最多只有两个线程可以同时运行。`ExecutorService`用于创建一个线程池,执行10个MySemaphore线程。每个MySemaphore线程在运行时首先检查是否有可用的许可证,如果有则获取一个许可证并打印消息,表示获得了资源。然后,线程模拟执行任务(通过`Thread.sleep()`随机睡眠一段时间),任务完成后释放许可证。主线程在所有线程执行完毕后,再获取2个许可证,确保所有线程已经完成,然后释放这2个许可证,表示资源清理完毕。
`acquireUninterruptibly()`方法与`acquire()`类似,但不会响应中断信号,即使在调用线程被中断时也会继续等待许可证。`release()`方法则用于增加许可证的数量,如果当前许可证计数小于零,则将其设置为零。
总结来说,Semaphore在Java并发编程中扮演着重要的角色,它提供了对资源访问的有效控制,避免了过多的并发导致的问题,实现了线程之间的协作和同步。在实际开发中,根据需求合理地使用Semaphore可以帮助优化系统的并发性能,确保系统稳定且高效地运行。