获取Semaphore的方法是否优先阻塞线程?

时间:2015-09-04 03:36:29

标签: java semaphore java.util.concurrent

Semaphore sema = new Semaphore(1);

创建一个Semaphore对象和默认初始化,唯一一个许可证,当多个线程同时试图获取许可证时,必须更改只有一个线程可以访问权限,那么其他线程将在外面等待,当第一个线程释放许可证,然后等待线程有权获得许可证,或者它是第一个到达并等待线程有权获得 谁能帮助我,我会非常感激

1 个答案:

答案 0 :(得分:1)

来自Semaphore javadoc

  

此类的构造函数可选择接受 fairness 参数。设置为false时,此类不保证线程获取许可的顺序。特别是,允许​​ barging ,也就是说,调用acquire()的线程可以在一直等待的线程之前分配许可 - 逻辑上新线程将自己放置在等待线程的队列。当公平性设置为true时,信号量保证选择调用任何acquire方法的线程以按照它们调用这些方法的顺序获得许可(先进先出; FIFO)。请注意,FIFO排序必然适用于这些方法中的特定内部执行点。因此,一个线程可以在另一个线程之前调用acquire,但是在另一个线程之后到达排序点,并且类似地从该方法返回时。另请注意,不定时的tryAcquire方法不遵守公平性设置,但会接受任何可用的许可。

因此,您可以选择在两个不同的顺序之间初始化Semaphore

  • 如果使用new Semaphore(1, true)初始化,那么当多个线程在等待时,调用acquire()的第一个线程将是第一个接收许可的线程。也就是说,许可将按线程请求它们的顺序提供给线程。
  • 如果您使用new Semaphore(1, false)equivalently new Semaphore(1)初始化,那么每当线程调用acquire()时,它将成为获得许可的第一个线程。也就是说,当许可证可用时,调用acquire()的最后一个线程将是第一个接收它的线程。
相关问题