5

如果您有一个资源,一次只能访问一次,您可以使用大小为 1 的信号量,或者您可以只使用单个 ReentrantLock 实例?

使一个或另一个更好的决定的细微差别是什么?

4

4 回答 4

7

有以下区别:

  1. 信号量可以由一个线程获取并由另一个线程释放。这样,一个线程可以向另一个线程发出信号。计数为 1 的信号量也可用于互斥。另一方面,锁仅用于互斥。
  2. 信号量是不可重入的。这意味着当许可用尽时,即使它已被同一线程获取,线程也无法获取信号量。锁可以是可重入的。
于 2013-03-28T10:28:04.063 回答
1

Semaphores 有利于计算许可/释放,所以如果你有不止一种资源,Locketal. 对你帮助不大。但是,如果您只有一种资源需要保护,它们就足够了。

于 2013-03-28T10:16:57.747 回答
0

计数信号量示例:您有一个受保护的对象,限制为最多允许五个线程同时访问它。在这种情况下,初始值为 5 的计数信号量是数学拟合。唐尼的信号量小书是理解这些结构的最佳读物之一。

于 2013-03-28T10:22:16.970 回答
0

虽然这两者都可以做到,但synchronizedSemaphore首先必须弄清楚您将如何使用此资源。如果你使用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参数,只是为了比较同一个对象是否释放了信号量。

于 2013-03-28T10:30:59.847 回答