【问题标题】:Acquire method of Semaphore blocked thread with priority?获取信号量阻塞线程优先级的方法?
【发布时间】:2015-09-04 03:36:29
【问题描述】:

信号量 sema = new Semaphore(1);

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

【问题讨论】:

  • 对不起,很难理解你在问什么。这些中的任何一个都大致相当于您的问题吗? “当多个线程正在等待来自Semaphore 的许可时,线程将按什么顺序接收它们?” “如何配置 Semaphore 之类的东西,以便在多个线程等待许可时赋予某些线程更高的优先级?”
  • @Alden 我的意思是,默认情况下,阻塞线程是按优先级获取的信号量?你懂吗
  • 在那条评论中,我不理解“是信号量”和“优先获取”。
  • @Alden 当多个线程正在等待来自信号量的许可时,线程将按什么顺序接收它们?

标签: java semaphore java.util.concurrent


【解决方案1】:

来自Semaphore javadoc

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

因此,您可以在初始化 Semaphore 时在两个不同的排序之间进行选择:

  • 如果使用new Semaphore(1, true) 进行初始化,那么当多个线程在等待时,第一个调用acquire() 的线程将最先获得许可。也就是说,许可将按照线程请求的顺序授予线程。
  • 如果改为使用new Semaphore(1, false)equivalently new Semaphore(1) 进行初始化,那么每当线程调用acquire() 时,它将成为第一个获得许可的线程。也就是说,当许可可用时,最后一个调用acquire() 的线程将是第一个接收它的线程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多