Semaphore机制与TCp通信中的应用以及双缓存优化

 一 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操作,而缓存数目有限的情况下,缓存需要处理完数据之后才会清空,导致缓存清空过慢。

     有没有更好的设计可以尽快的清理缓存呢?大家可以思考一下

   


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值