java – BlockingQueue vs Semaphore
发布时间:2020-12-15 05:09:20 所属栏目:Java 来源:网络整理
导读:如果我们想要实现资源池,例如数据库连接池.您将使用哪个并发集合? BlockingQueue还是Semaphore? 对于BlockingQueue,就像生产者 – 消费者设计模式一样,生产者将所有连接放在队列上,消费者将从队列中获取下一个可用连接. 对于Semaphore,您将信号量指定为池
如果我们想要实现资源池,例如数据库连接池.您将使用哪个并发集合? BlockingQueue还是Semaphore?
对于BlockingQueue,就像生产者 – 消费者设计模式一样,生产者将所有连接放在队列上,消费者将从队列中获取下一个可用连接. 对于Semaphore,您将信号量指定为池大小,并获取许可,直到达到池大小并等待其中任何一个释放许可并将资源放回池中. 哪一个更简单,更容易?什么是我们只能使用一个而不是其他的情况? 解决方法
BlockingQueue更简单,因为它也会跟踪Connections /资源.
例如 public abstract class ResourcePool<Resource> { private final BlockingQueue<Resource> free; protected ResourcePool(int freeLimit) { free = new ArrayBlockingQueue<>(freeLimit); } public Resource acquire() { Resource resource = free.poll(); return resource == null ? create() : resource; } public void recycle(Resource resource) { if (!free.offer(resource)) close(resource); } protected abstract Resource create(); protected abstract void close(Resource resource); } 如您所见,BlockingQueue有助于跟踪免费资源并确保没有太多免费资源.它是线程安全的,无需显式锁定. 如果使用信号量,则仍需要将资源存储在集合中(使信号量变为冗余;) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |