1,生产与消费关系,Writer 和 Reader
int reads = 0;
boolean writeLock = false; //如果正在写入,则为true
Condition canWrite;
Condition canRead;
monitorEntry void beginRead()
{
if(writeLock || queue( canWrite )) //如果有正在写的线程,或等待写的线程
{
wait(canRead);
}
++reads; //支持多个线程读
signal(canRead);
}
monitorEntry void endRead()
{
--reads;
if(reads == 0) //如果没有线程需要读
{
signal(canWrite)
}
}
-------------------------------------------------------------
monitorEntry void beginWrite()
{
if(reads > 0 || writeLocal ) //如果有等待的读线程 或 存在有正在写的线程,则等待....
{
wait(canWrite);
}
writeLocal = true; //反之,则锁定所有的读和写(独占方式)
}
monitorEntry void endWrite()
{
writeLocal = false; //释放锁
if( queue(canRead) ) //如果有等待读的线程
{
signal(canRead);
}
else
{
signal(canWrite);
}
}
-------------------------------------------------------------
2, 循环缓冲区
interface Buffer
{
void set(int value);
int get();
}
public class SynchronizedBuffer implements Buffer
{
private int buffer[] = {-1,-1,-1}; //共享区
private int occupiedBuffers = 0; //占用的共享区
private int readLocation = 0;
private int writeLocation = 0;
public void set(int value)
{
sting name = Thread.CurrentThread.Name;
while(occupiedBuffers = buffer.length) //如果已经填充满
{
wait();
}
buffer[writeLocation] = value;
writeLocation = (writeLocation + 1) % buffer.length;
++occupiedBuffers ;
notify(); //通知可以消费
}
pblic int get()
{
sting name = Thread.CurrentThread.Name;
while(occupiedBuffers = 0) //如果共享区是空
{
wait(); //等待生产
}
int readValue = buffers[readLocation];
--occupiedBuffers ;
readLocation = (readLocation + 1) % buffers.length;
}
}
int reads = 0;
boolean writeLock = false; //如果正在写入,则为true
Condition canWrite;
Condition canRead;
monitorEntry void beginRead()
{
if(writeLock || queue( canWrite )) //如果有正在写的线程,或等待写的线程
{
wait(canRead);
}
++reads; //支持多个线程读
signal(canRead);
}
monitorEntry void endRead()
{
--reads;
if(reads == 0) //如果没有线程需要读
{
signal(canWrite)
}
}
-------------------------------------------------------------
monitorEntry void beginWrite()
{
if(reads > 0 || writeLocal ) //如果有等待的读线程 或 存在有正在写的线程,则等待....
{
wait(canWrite);
}
writeLocal = true; //反之,则锁定所有的读和写(独占方式)
}
monitorEntry void endWrite()
{
writeLocal = false; //释放锁
if( queue(canRead) ) //如果有等待读的线程
{
signal(canRead);
}
else
{
signal(canWrite);
}
}
-------------------------------------------------------------
2, 循环缓冲区
interface Buffer
{
void set(int value);
int get();
}
public class SynchronizedBuffer implements Buffer
{
private int buffer[] = {-1,-1,-1}; //共享区
private int occupiedBuffers = 0; //占用的共享区
private int readLocation = 0;
private int writeLocation = 0;
public void set(int value)
{
sting name = Thread.CurrentThread.Name;
while(occupiedBuffers = buffer.length) //如果已经填充满
{
wait();
}
buffer[writeLocation] = value;
writeLocation = (writeLocation + 1) % buffer.length;
++occupiedBuffers ;
notify(); //通知可以消费
}
pblic int get()
{
sting name = Thread.CurrentThread.Name;
while(occupiedBuffers = 0) //如果共享区是空
{
wait(); //等待生产
}
int readValue = buffers[readLocation];
--occupiedBuffers ;
readLocation = (readLocation + 1) % buffers.length;
}
}

浙公网安备 33010602011771号