本文介绍的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})
2)实现读写锁
eclipse使用它,解决日志操作相关类在map,数组中的同步问题.
3)延迟信号量
这个信号量的亮点在acquire(long delay).
*总结
---通过java的对象锁,wait/notify机制模拟的信号量,可以呈现多种形态以应对各种的互斥需求.
---本文给出的例子,具有普遍的适用性.在实践中,咱们可以根据需求定制各种信号量实现.
---jdk1.5提供了Semaphore的另一种实现机制.