Semaphore sema = new Semaphore(1);
创建一个Semaphore对象和默认初始化,唯一一个许可证,当多个线程同时试图获取许可证时,必须更改只有一个线程可以访问权限,那么其他线程将在外面等待,当第一个线程释放许可证,然后等待线程有权获得许可证,或者它是第一个到达并等待线程有权获得 谁能帮助我,我会非常感激
答案 0 :(得分:1)
此类的构造函数可选择接受 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()
的最后一个线程将是第一个接收它的线程。