- Java并發(fā)編程:核心方法與框架
- 高洪巖
- 427字
- 2019-01-03 02:34:14

1.1.7 公平與非公平信號(hào)量的測(cè)試
有些時(shí)候,獲得許可的順序與線程啟動(dòng)的順序有關(guān),這時(shí)信號(hào)量就要分為公平與非公平的。
所謂的公平信號(hào)量是獲得鎖的順序與線程啟動(dòng)的順序有關(guān),但不代表100%地獲得信號(hào)量,僅僅是在概率上能得到保證。而非公平信號(hào)量就是無(wú)關(guān)的了。
創(chuàng)建測(cè)試用的項(xiàng)目semaphoreFairTest,類MyService.java代碼如下:
package myservice; import java.util.concurrent.Semaphore; public class MyService { private boolean isFair = false; private Semaphore semaphore = new Semaphore(1, isFair); public void testMethod() { try { semaphore.acquire(); System.out .println("ThreadName=" + Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); } finally { semaphore.release(); } } }
類MyThread.java代碼如下:
package extthread; import myservice.MyService; public class MyThread extends Thread { private MyService myService; public MyThread(MyService myService) { super(); this.myService = myService; } @Override public void run() { System.out.println("ThreadName=" + this.getName() + "啟動(dòng)了!"); myService.testMethod(); } }
類Run.java代碼如下:
package test.run; import myservice.MyService; import extthread.MyThread; public class Run { public static void main(String[] args) { MyService service = new MyService(); MyThread firstThread = new MyThread(service); firstThread.start(); MyThread[] threadArray = new MyThread[4]; for (int i = 0; i < 4; i++) { threadArray[i] = new MyThread(service); threadArray[i].start(); } } }
程序運(yùn)行后的效果如圖1-15所示。

圖1-15 亂序打印
非公平信號(hào)量運(yùn)行的效果是線程啟動(dòng)的順序與調(diào)用semaphore.acquire()的順序無(wú)關(guān),也就是線程先啟動(dòng)了并不代表先獲得許可。
更改MyService.java類代碼如下:
private boolean isFair = true;
程序運(yùn)行結(jié)果如圖1-16所示。

圖1-16 有序打印
公平信號(hào)量運(yùn)行的效果是線程啟動(dòng)的順序與調(diào)用semaphore.acquire()的順序有關(guān),也就是先啟動(dòng)的線程優(yōu)先獲得許可。
推薦閱讀
- 程序員修煉之道:程序設(shè)計(jì)入門30講
- Apache Spark 2.x Machine Learning Cookbook
- Access 數(shù)據(jù)庫(kù)應(yīng)用教程
- PowerCLI Cookbook
- Python金融數(shù)據(jù)分析
- MySQL數(shù)據(jù)庫(kù)基礎(chǔ)實(shí)例教程(微課版)
- C++新經(jīng)典
- 零基礎(chǔ)入門學(xué)習(xí)Python(第2版)
- Julia高性能科學(xué)計(jì)算(第2版)
- Serverless Web Applications with React and Firebase
- Python無(wú)監(jiān)督學(xué)習(xí)
- 一覽眾山小:ASP.NET Web開(kāi)發(fā)修行實(shí)錄
- 高性能MVVM框架的設(shè)計(jì)與實(shí)現(xiàn):San
- Python 3.6從入門到精通(視頻教學(xué)版)
- 區(qū)塊鏈原理、設(shè)計(jì)與應(yīng)用