少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks
          Semaphore當前在多線程環境下被擴放使用,操作系統的信號量是個很重要的概念,在進程控制方面都有應用。Java 并發庫 的Semaphore 可以很輕松完成信號量控制,Semaphore可以控制某個資源可被同時訪問的個數,通過 acquire() 獲取一個許可,如果沒有就等待,而 release() 釋放一個許可。比如在Windows下可以設置共享文件的最大客戶端訪問個數。 

          Semaphore實現的功能就類似廁所有5個坑,假如有10個人要上廁所,那么同時只能有多少個人去上廁所呢?同時只能有5個人能夠占用,當5個人中 的任何一個人讓開后,其中等待的另外5個人中又有一個人可以占用了。另外等待的5個人中可以是隨機獲得優先機會,也可以是按照先來后到的順序獲得機會,這取決于構造Semaphore對象時傳入的參數選項。單個信號量的Semaphore對象可以實現互斥鎖的功能,并且可以是由一個線程獲得了“鎖”,再由另一個線程釋放“鎖”,這可應用于死鎖恢復的一些場合。

          Semaphore維護了當前訪問的個數,提供同步機制,控制同時訪問的個數。在數據結構中鏈表可以保存“無限”的節點,用Semaphore可以實現有限大小的鏈表。另外重入鎖 ReentrantLock 也可以實現該功能,但實現上要復雜些。 

          下面的Demo中申明了一個只有5個許可的Semaphore,而有20個線程要訪問這個資源,通過acquire()和release()獲取和釋放訪問許可。

          package com.test;

          import java.util.concurrent.ExecutorService;

          import java.util.concurrent.Executors;

          import java.util.concurrent.Semaphore;

          public class TestSemaphore {

                          public static void main(String[] args) {

                          // 線程池

                          ExecutorService exec = Executors.newCachedThreadPool();

                          // 只能5個線程同時訪問

                          final Semaphore semp = new Semaphore(5);

                           // 模擬20個客戶端訪問

                           for (int index = 0; index < 20; index++) {

                                        final int NO = index;

                                        Runnable run = new Runnable() {

                                                           public void run() {

                                                                      try {

                                                                              // 獲取許可

                                                                              semp.acquire();

                                                                              System.out.println("Accessing: " + NO);

                                                                              Thread.sleep((long) (Math.random() * 10000));

                                                                              // 訪問完后,釋放

                                                                              semp.release();

                                                                              System.out.println("-----------------"+semp.availablePermits());

                                                                      } catch (InterruptedException e) {

                                                                              e.printStackTrace();

                                                                      }

                                                            }

                                                };

                                exec.execute(run);

                       }

                       // 退出線程池

                       exec.shutdown();

                 }

          執行結果如下:

          Accessing: 0

          Accessing: 1

          Accessing: 3

          Accessing: 4

          Accessing: 2

          -----------------0

          Accessing: 6

          -----------------1

          Accessing: 7

          -----------------1

          Accessing: 8

          -----------------1

          Accessing: 10

          -----------------1

          Accessing: 9

          -----------------1

          Accessing: 5

          -----------------1

          Accessing: 12

          -----------------1

          Accessing: 11

          -----------------1

          Accessing: 13

          -----------------1

          Accessing: 14

          -----------------1

          Accessing: 15

          -----------------1

          Accessing: 16

          -----------------1

          Accessing: 17

          -----------------1

          Accessing: 18

          -----------------1

          Accessing: 19




          http://www.cnblogs.com/whgw/archive/2011/09/29/2195555.html
          posted on 2013-01-08 00:11 abin 閱讀(367) 評論(0)  編輯  收藏 所屬分類: JavaMultithread
          主站蜘蛛池模板: 永登县| 邹平县| 竹溪县| 汉沽区| 尚志市| 景德镇市| 神木县| 瑞丽市| 鲁甸县| 德格县| 濮阳县| 泸水县| 博客| 邓州市| 建水县| 宜昌市| 冷水江市| 海南省| 陆丰市| 洛南县| 长寿区| 铜川市| 肇庆市| 越西县| 安福县| 新巴尔虎左旗| 南京市| 聂荣县| 凌云县| 棋牌| 雅江县| 霍邱县| 班玛县| 福安市| 巴青县| 台东市| 广水市| 天全县| 新巴尔虎左旗| 龙里县| 双城市|