pet*_*ter 4 java concurrency multithreading semaphore blockingqueue
如果我们想要实现资源池,例如数据库连接池.您将使用哪个并发集合?BlockingQueue还是Semaphore?
因为BlockingQueue,就像生产者 - 消费者设计模式一样,生产者将所有连接放在队列上,而消费者将从队列中获取下一个可用连接.
对于Semaphore,您将信号量指定为池大小,并获取许可,直到达到池大小并等待其中任何一个释放许可并将资源放回池中.
哪一个更简单,更容易?什么是我们只能使用一个而不是其他的情况?
Pet*_*rey 14
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);
}
Run Code Online (Sandbox Code Playgroud)
如您所见,BlockingQueue有助于跟踪免费资源并确保没有太多免费资源.它是线程安全的,无需显式锁定.
如果使用信号量,则仍需要将资源存储在集合中(使信号量变为冗余;)
| 归档时间: |
|
| 查看次数: |
4019 次 |
| 最近记录: |