中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Java > java高级编程
关于多线程同步的初步教程--Simaphore的设计及使用
作者:未知 时间:2005-07-24 21:15 出处:JR 责编:chinaitpower
              摘要:关于多线程同步的初步教程--Simaphore的设计及使用
    在前面的“关于多线程同步的初步教程--Metux的设计及使用”一文中,我们讨论了Doug Lea的concurrent包的Mutux的设计及实现,本文讨论一下多线程编程中同样常用的Simaphore的设计和使用。Simaphore也继承于Sync接口,和Mutex相比,Simaphore增加了同步的计数支持。一个Simaphore,代表了多个许可,可以一次获取多个许可,也可以一次释放多个许可。如果将Simaphore的许可数减少到1,那么就可以作为一个Mutex使用了。下面的代码演示了Simaphore的基本使用:

  1.  class Pool {
  2.     static final MAX_AVAILABLE = 100; // 100个许可
  3.     private final Semaphore available = new Semaphore(MAX_AVAILABLE);
  4.     
  5.     public Object getItem() throws InterruptedException { // no synch
  6.       available.acquire();
  7.       return getNextAvailableItem();
  8.     }
  9.  
  10.     public void putItem(Object x) { // no synch
  11.       if (markAsUnused(x))
  12.         available.release();
  13.     }
  14.  
  15.    // Not a particularly efficient data structure; just for demo
  16.  
  17.     protected Object[] items = ... whatever kinds of items being managed
  18.     protected boolean[] used = new boolean[MAX_AVAILABLE];
  19.  
  20.     protected synchronized Object getNextAvailableItem() { 
  21.       for (int i = 0; i < MAX_AVAILABLE; ++i) {
  22.         if (!used[i]) {
  23.            used[i] = true;
  24.            return items[i];
  25.         }
  26.       }
  27.       return null// not reached 
  28.     }
  29.  
  30.     protected synchronized boolean markAsUnused(Object item) { 
  31.       for (int i = 0; i < MAX_AVAILABLE; ++i) {
  32.         if (item == items[i]) {
  33.            if (used[i]) {
  34.              used[i] = false;
  35.              return true;
  36.            }
  37.            else
  38.              return false;
  39.         }
  40.       }
  41.       return false;
  42.     }
  43.  
  44.   }

可见,Simaphore是对Mutex的增强,Simaphore也和Mutex相比,增加了如下的方法:

1、public Semaphore(long initialPermits)
构造函数,指定许可的数量。
2、public synchronized long permits()
返回许可的数量。
3、public synchronized void release(long n)
一次释放n个许可。

相应的,在Simaphore的实现中,也增加了一个字段,存储许可的数量:
protected long permits_;

acquire和release方法也有相应的变化:

  1.   /** Wait until a permit is available, and take one **/
  2.   public void acquire() throws InterruptedException {
  3.     if (Thread.interrupted()) throw new InterruptedException();
  4.     synchronized(this) {
  5.       try {
  6.         while (permits_ <= 0) wait();
  7.         --permits_;
  8.       }
  9.       catch (InterruptedException ex) {
  10.         notify();
  11.         throw ex;
  12.       }
  13.     }
  14.   }
  15.   /** Release a permit **/
  16.   public synchronized void release() {
  17.     ++permits_;
  18.     notify();
  19.   }

这些代码都容易理解,特别需要注意的是新增的release(long n)的方法,

  1.   public synchronized void release(long n) {
  2.     if (n < 0) throw new IllegalArgumentException("Negative argument");
  3.     permits_ += n;
  4.     for (long i = 0; i < n; ++i) notify();
  5.   }


其中恢复多个许可,同时,要通过一个循环来notify()其它线程。Simaphore的概念在多线程编程中已经广为熟知,在C++和其它很多语言中也有支持。Doug Lea提供的concurrent包中的Simaphore实现为我们提供了Java中Simaphore的工业强度实现版本,方便了我们在多线程环境中的编程。

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有