如果您有一个资源,一次只能访问一次,您可以使用大小为 1 的信号量,或者您可以只使用单个 ReentrantLock 实例?
使一个或另一个更好的决定的细微差别是什么?
如果您有一个资源,一次只能访问一次,您可以使用大小为 1 的信号量,或者您可以只使用单个 ReentrantLock 实例?
使一个或另一个更好的决定的细微差别是什么?
有以下区别:
Semaphore
s 有利于计算许可/释放,所以如果你有不止一种资源,Lock
etal. 对你帮助不大。但是,如果您只有一种资源需要保护,它们就足够了。
计数信号量示例:您有一个受保护的对象,限制为最多允许五个线程同时访问它。在这种情况下,初始值为 5 的计数信号量是数学拟合。唐尼的信号量小书是理解这些结构的最佳读物之一。
虽然这两者都可以做到,但synchronized
您Semaphore
首先必须弄清楚您将如何使用此资源。如果你使用synchronized
这意味着你将不得不观察线程中的同步:
public void run() {
// some code
synchronized (resource) {
// use resource
}
}
如果您不想让线程对此进行监视(我认为这更好),请Semaphore
在资源的 getter 方法中使用:
public Resource acquireResource() {
// acquire semaphore
return resource;
}
public void releaseResource() {
// release semaphore
}
并在线程中执行:
public void run() {
// some code
Resource resource = ResourceContainer.getResource();
// do something with resource
releaseResource();
}
您可以向这些方法添加Object
参数,只是为了比较同一个对象是否释放了信号量。