Semephore類是java.util.concurrent包下處理并發(fā)的工具類,Semephore能夠控制任務(wù)訪問資源的數(shù)量,如果資源不夠农渊,則任務(wù)阻塞,等待其他資源的釋放或颊。
比如一個(gè)停車場有三個(gè)車位砸紊,當(dāng)車位空余數(shù)量小于3時(shí),車輛可以進(jìn)入停車場停車囱挑。如果停車場已經(jīng)沒有了空余車位醉顽,后面來的車就不能進(jìn)入停車場,只能在停車場外等待平挑,等其他車輛離開之后才能進(jìn)入游添。
Semephore類的主要方法
構(gòu)造方法:
Semaphore(int permits)
Semaphore(int permits, boolean fair)
有兩個(gè)構(gòu)造方法系草,第一個(gè)參數(shù)表示可以同時(shí)訪問資源的最大任務(wù)數(shù),第二個(gè)是個(gè)boolean類型唆涝,表示是否公平鎖找都。
公平鎖和非公平鎖:程序在執(zhí)行并發(fā)任務(wù)的時(shí)候,拿到同步鎖的任務(wù)執(zhí)行代碼廊酣,其他任務(wù)阻塞等待能耻,一旦同步鎖被釋放,CPU會(huì)正在等待的任務(wù)分配資源啰扛,獲取同步鎖嚎京。在這里又兩種策略,CPU默認(rèn)從等待的任務(wù)中隨機(jī)分配隐解,這是非公平鎖鞍帝;公平鎖是按照等待時(shí)間優(yōu)先級來分配,等待的時(shí)間越久煞茫,先獲取任務(wù)鎖帕涌。其內(nèi)部是一個(gè)同步列隊(duì)實(shí)現(xiàn)的。主要方法
acquire();獲取許可续徽,Semephore任務(wù)數(shù)加一
release();釋放許可蚓曼,Semephore任務(wù)數(shù)減一
還有幾個(gè)方法如tryAcquire()嘗試獲取許可,返回boolean值钦扭,不阻塞纫版。availablePermits()還剩幾個(gè)任務(wù)許可,等等幾個(gè)方法和Lock類的用法相似客情。代碼示例:
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(3);
ExecutorService exec = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
exec.execute(new Task(semaphore));
}
// semaphore.acquireUninterruptibly(3);
exec.shutdown();
}
public static class Task implements Runnable {
private Semaphore semaphore;
public Task(Semaphore semaphore) {
this.semaphore = semaphore;
}
@Override
public void run() {
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + "獲取了資源");
TimeUnit.SECONDS.sleep(1);
System.out.println(Thread.currentThread().getName() + "準(zhǔn)備釋放資源");
semaphore.release();
System.out.println(Thread.currentThread().getName() + "釋放了資源");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
輸出:
pool-1-thread-1獲取了資源
pool-1-thread-2獲取了資源
pool-1-thread-3獲取了資源
pool-1-thread-3準(zhǔn)備釋放資源
pool-1-thread-1準(zhǔn)備釋放資源
pool-1-thread-1釋放了資源
pool-1-thread-3釋放了資源
pool-1-thread-2準(zhǔn)備釋放資源
pool-1-thread-2釋放了資源
pool-1-thread-5獲取了資源
pool-1-thread-4獲取了資源
pool-1-thread-6獲取了資源
pool-1-thread-6準(zhǔn)備釋放資源
pool-1-thread-5準(zhǔn)備釋放資源
pool-1-thread-4準(zhǔn)備釋放資源
pool-1-thread-4釋放了資源
pool-1-thread-7獲取了資源
pool-1-thread-5釋放了資源
pool-1-thread-8獲取了資源
pool-1-thread-6釋放了資源
pool-1-thread-9獲取了資源
pool-1-thread-8準(zhǔn)備釋放資源
pool-1-thread-7準(zhǔn)備釋放資源
pool-1-thread-10獲取了資源
pool-1-thread-9準(zhǔn)備釋放資源
pool-1-thread-9釋放了資源
pool-1-thread-7釋放了資源
pool-1-thread-8釋放了資源
pool-1-thread-10準(zhǔn)備釋放資源
pool-1-thread-10釋放了資源