Semaphore:信號(hào)量通常用于限制線程的數(shù)量訪問一些(物理或邏輯)資源祟牲。個(gè)人理解:限流枷邪、控制訪問量榛搔。
使用場(chǎng)景:競(jìng)爭(zhēng)僅有的資源、一個(gè)車廂最多可容納多少人數(shù)东揣,超載則不能上車践惑,或者每條通道一次僅能n個(gè)人進(jìn)入,剩下的需要排隊(duì)等等嘶卧。尔觉。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.Semaphore;
/**
* 信號(hào)量
* Semaphore限流、控制訪問量
*/
public class SemaphoreTest {
public static final Logger logger = LoggerFactory.getLogger(SemaphoreTest.class);
public static void main(String[] args) {
/**
* Creates a {@code Semaphore} with the given number of
* permits and nonfair fairness setting.
*
* @param permits the initial number of permits available.
* This value may be negative, in which case releases
* must occur before any acquires will be granted.
*/
// public Semaphore(int permits);
/**
* Creates a {@code Semaphore} with the given number of
* permits and the given fairness setting.
*
* @param permits the initial number of permits available.
* This value may be negative, in which case releases
* must occur before any acquires will be granted.
* @param fair {@code true} if this semaphore will guarantee
* first-in first-out granting of permits under contention,
* else {@code false}
*/
// public Semaphore(int permits, boolean fair);
//初始化2個(gè)信號(hào)量,也就是說同時(shí)最多只能有2個(gè)請(qǐng)求的訪問
Semaphore semaphore = new Semaphore(2);
//模擬5次調(diào)用芥吟,循環(huán)5次侦铜,開啟5個(gè)異步線程
for (int i = 1; i <= 5; i++) {
new Thread(() -> {
try {
//獲得訪問機(jī)會(huì)
semaphore.acquire();
logger.info(Thread.currentThread().getName() + "獲得訪問機(jī)會(huì)!");
} catch (InterruptedException e) {
e.printStackTrace();
}
//假設(shè)這里有一個(gè)1秒鐘的任務(wù)专甩,阻塞一秒
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
//釋放許可,
logger.info(Thread.currentThread().getName() + "釋放許可钉稍,釋放當(dāng)前線程!");
semaphore.release();
logger.info(Thread.currentThread().getName() + "================================================");
}).start();
}
}
}
Semaphore并不能保證程序的順序和安全性涤躲。
輸出日志:
11:59:54.157 [Thread-1] INFO com.test.tenant.SemaphoreTest - Thread-1獲得訪問機(jī)會(huì)!
11:59:54.157 [Thread-0] INFO com.test.tenant.SemaphoreTest - Thread-0獲得訪問機(jī)會(huì)!
11:59:55.165 [Thread-0] INFO com.test.tenant.SemaphoreTest - Thread-0釋放許可,釋放當(dāng)前線程!
11:59:55.165 [Thread-1] INFO com.test.tenant.SemaphoreTest - Thread-1釋放許可贡未,釋放當(dāng)前線程!
11:59:55.165 [Thread-0] INFO com.test.tenant.SemaphoreTest - Thread-0================================================
11:59:55.165 [Thread-1] INFO com.test.tenant.SemaphoreTest - Thread-1================================================
11:59:55.165 [Thread-2] INFO com.test.tenant.SemaphoreTest - Thread-2獲得訪問機(jī)會(huì)!
11:59:55.165 [Thread-3] INFO com.test.tenant.SemaphoreTest - Thread-3獲得訪問機(jī)會(huì)!
11:59:56.167 [Thread-3] INFO com.test.tenant.SemaphoreTest - Thread-3釋放許可种樱,釋放當(dāng)前線程!
11:59:56.167 [Thread-2] INFO com.test.tenant.SemaphoreTest - Thread-2釋放許可,釋放當(dāng)前線程!
11:59:56.168 [Thread-3] INFO com.test.tenant.SemaphoreTest - Thread-3================================================
11:59:56.168 [Thread-2] INFO com.test.tenant.SemaphoreTest - Thread-2================================================
11:59:56.168 [Thread-4] INFO com.test.tenant.SemaphoreTest - Thread-4獲得訪問機(jī)會(huì)!
11:59:57.172 [Thread-4] INFO com.test.tenant.SemaphoreTest - Thread-4釋放許可羞秤,釋放當(dāng)前線程!
11:59:57.173 [Thread-4] INFO com.test.tenant.SemaphoreTest - Thread-4================================================