一 Semaphore 信号量
三个名词:Semaphore, Operation P, Operation V
用抢车位的概念解释这三个名词。
S-》代表目前的车位数,比如是3
P-》代表有车要进车位了,每次进来一辆,S就会自减1,当S=0的时候,其他车辆就要wait。
V-》代表有车子要从车位离开了,每次离开一辆,S就会自加1,并且让外面等待的车子进来。
理解了这个概念,下面的两个概念就好理解了,当车位数只有1的时候,就表示这个车位只能被1辆车使用,
是不是和线程同步的概念很接近了?
二 TCP通信中的应用
S-》TCPQueue,maxsize设定为20,表示能有20个车位,为一个List的结构,enqueue和dequeue方法都做了线程同步.
简单的代码如下
class TCPQueue{
int limitSize = 20;
List m_list = new Vector();
public synchronized Object dequeue(){
int size = m_list.size();
Object o = null;
if (m_list != null && m_list.size() > 0) {
o = m_list.remove(0);
notifyAll();
}
return o;
}
public synchronized void enqueue(Object item) {
m_list.add(item);
if(m_list.size()>=20){
wait();
}
}
}
P-》在一个线程中处理TCP的数据读取,TCP连接中每读取一个包,则往TCPQueue里面添加一个包,如果size到达20,则线程会阻塞,不让继续添加。
Thread receiveT = new Thread(){
while(isrunning){
struct = readData();
queue.enqueue(struct};
process(struct);
}
}
V-》另一个线程处理TCPQueue当中先进先出的数据
Thread processT = new Thread(){
while(isrunning){
struct = queue.dequeue(};
process(struct);
}
}
以上就是一个Semaphore机制的应用。但是这样的设计虽然可以适应一般的网络环境,一旦网络传过来的包过快,则会出现问题。
由于使用一个queue同时进行reveive和process操作,而缓存数目有限的情况下,缓存需要处理完数据之后才会清空,导致缓存清空过慢。
有没有更好的设计可以尽快的清理缓存呢?大家可以思考一下