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

1.1.2 類Semaphore構造方法permits參數作用

參數permits的作用是設置許可的個數,前面已經使用過代碼:


        private Semaphore semaphore = new Semaphore(1);

來進行程序的設計,使同一時間內最多只有1個線程可以執(zhí)行acquire()和release()之間的代碼,因為只有1個許可。

其實還可以傳入>1的許可,代表同一時間內,最多允許有x個線程可以執(zhí)行acquire()和release()之間的代碼。

創(chuàng)建實驗用的項目SemaphoreTest2,將SemaphoreTest1項目中的所有源代碼復制到SemaphoreTest2中。

并更改類Service.java代碼如下:


        package service;
        import java.util.concurrent.Semaphore;
        public class Service {
            private Semaphore semaphore = new Semaphore(2);
            public void testMethod() {
                try {
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName()
                              + " begin timer=" + System.currentTimeMillis());
                    Thread.sleep(5000);
                    System.out.println(Thread.currentThread().getName()
                              + "    end timer=" + System.currentTimeMillis());
                    semaphore.release();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

使用代碼new Semaphore(2)來實例化Semaphore類的含義是同一時間內最多允許2個線程執(zhí)行acquire()和release()之間的代碼。

創(chuàng)建3個線程類如圖1-5所示。

圖1-5 3個線程類代碼

程序運行后的效果如圖1-6所示。

圖1-6中打印的結果說明同一時間只有2個線程可以同時執(zhí)行acquire()和release()之間的代碼。

圖1-6 線程AB共同進入C被排斥

另外需要說明一下,對Semaphore類的構造方法傳遞的參數permits值如果大于1時,該類并不能保證線程安全性,因為還是有可能會出現多個線程共同訪問實例變量,導致出現臟數據的情況。

主站蜘蛛池模板: 孟村| 依安县| 西平县| 克什克腾旗| 泰宁县| 保亭| 和平县| 淮滨县| 太仆寺旗| 辽宁省| 德江县| 仪陇县| 黄山市| 谢通门县| 盐城市| 阜康市| 诸城市| 体育| 南汇区| 乐业县| 山阴县| 双柏县| 长丰县| 垫江县| 都江堰市| 阜平县| 涞源县| 阜康市| 丰原市| 成安县| 武穴市| 随州市| 巫溪县| 丰都县| 仪陇县| 宽甸| 阿拉善盟| 棋牌| 资源县| 德保县| 长沙市|