官术网_书友最值得收藏!

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)先獲得許可。

主站蜘蛛池模板: 永吉县| 车险| 拉孜县| 乃东县| 米林县| 罗定市| 河西区| 鄂尔多斯市| 东乡族自治县| 诏安县| 建湖县| 汽车| 景谷| 壤塘县| 吴江市| 牙克石市| 张家口市| 洛南县| 新沂市| 云林县| 从江县| 广汉市| 贵溪市| 招远市| 清丰县| 芮城县| 武城县| 普格县| 马公市| 通河县| 乌鲁木齐县| 余姚市| 祁门县| 馆陶县| 澄城县| 鹤峰县| 普安县| 封开县| 方正县| 霸州市| 安福县|