本文介绍的Semaphore实现基于synchronized,wait()和notify/notifyAll(),这是java并发包之前的典型实现方式.在eclipse的源码中可以找到不少这样的案例,下文中也会把eclipse中的几个实现类作为案例以分析之.

       注,这里介绍的信号量实现是基于java语言机制,用于实现多线程间的同步操作,所以对S,P(S),V(S)等概念的介绍将结合本文内容,做合适的调整,读者可阅读操作系统相关书籍的信号量章节获取标准定义.

 

*本文内容

---信号量简介

---典型案例

 

*Semaphore概述

---通常把一个非负整数称为Semaphore,表示为S.

S可以理解为可用的资源数量.这里不涉及进程问题,所以就假定S>=0.

---S实现的同步机制表示为PV原语操作

P(S):若S=0,线程进入等待队列;否则,—S;

V(S):++S,唤醒处于等待中的线程.

(注,P是荷兰语的Passeren,相当于英文的pass, V是荷兰语的Verhoog,相当于英文中的incremnet).

 

*案例

1)典型实现

这段程序源自ibm的一本并发书籍,实现了计数信号量{S|S∈{0,N}}和二元信号量(S={0,1})

S示例

2)实现读写锁

eclipse使用它,解决日志操作相关类在map,数组中的同步问题.

ReadWriteLock

3)延迟信号量

这个信号量的亮点在acquire(long delay).

灵活的Semaphore

 

 

*总结

---通过java的对象锁,wait/notify机制模拟的信号量,可以呈现多种形态以应对各种的互斥需求.

---本文给出的例子,具有普遍的适用性.在实践中,咱们可以根据需求定制各种信号量实现.

---jdk1.5提供了Semaphore的另一种实现机制.

posted on 2012-01-13 04:44  戴忠  阅读(7833)  评论(0编辑  收藏  举报