java producer-consumer monitor from: concurrent programming: the java programming language by steven...

16
Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press , 1998

Upload: randall-strickland

Post on 21-Jan-2016

214 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998

Java Producer-Consumer Monitor

From:

Concurrent Programming: The Java Programming Language

By Steven J. Hartley

Oxford University Press , 1998

Page 2: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998

Declare The Monitor (A Class)

class BoundedBuffer {

Page 3: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998

Shared Data

// designed for a single producer thread

// and a single consumer thread

private int numSlots = 0;

private double[] buffer = null;

private int putIn = 0, takeOut = 0;

private int count = 0;

Page 4: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998

public BoundedBuffer(int numSlots) {

if (numSlots <= 0) throw new IllegalArgumentException("numSlots<=0");

this.numSlots = numSlots;

buffer = new double[numSlots];

System.out.println("BoundedBuffer alive, numSlots=" + numSlots);

}

Initializer Entry Method

Page 5: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998

Producer Entry Method

public synchronized void deposit(double value) {

while (count == numSlots)

try {

wait();

} catch (InterruptedException e) {

System.err.println("interrupted out of wait");

}

buffer[putIn] = value;

putIn = (putIn + 1) % numSlots;

count++; // wake up the consumer

if (count == 1) notify(); // since it might be waiting

System.out.println(" after deposit, count=" + count

+ ", putIn=" + putIn);

}

Page 6: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998

Consumer Entry Method

public synchronized double fetch() {

double value;

while (count == 0)

try {

wait();

} catch (InterruptedException e) {

System.err.println("interrupted out of wait");

}

value = buffer[takeOut];

takeOut = (takeOut + 1) % numSlots;

count--; // wake up the producer

if (count == numSlots-1) notify(); // since it might be waiting

System.out.println(" after fetch, count=" + count

+ ", takeOut=" + takeOut);

return value;

}

Page 7: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998

End The Monitor Declaration

} // End the class (just like any other)

Page 8: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998

Java Fair Reader-Writer Monitor

From:

Concurrent Programming: The Java Programming Language

By Steven J. Hartley

Oxford University Press , 1998

Page 9: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998

Declare The Monitor (A Class)

class Database extends MyObject {

Page 10: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998

Shared Data

private int numReaders = 0;

private int numWriters = 0;

private int numWaitingReaders = 0;

private int numWaitingWriters = 0;

private boolean okToWrite = true;

private long startWaitingReadersTime = 0;

Page 11: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998

public Database() { super("rwDB"); } // Call the parent class’s constructor

Initializer Entry Method

Page 12: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998

startRead Entry Method

public synchronized void startRead(int i) {

long readerArrivalTime = 0;

if (numWaitingWriters > 0 || numWriters > 0) {

numWaitingReaders++;

readerArrivalTime = age();

while (readerArrivalTime >= startWaitingReadersTime)

try {wait();} catch (InterruptedException e) {}

numWaitingReaders--;

}

numReaders++;

}

Page 13: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998

endRead Entry Method

public synchronized void endRead(int i) {

numReaders--;

okToWrite = numReaders == 0;

if (okToWrite) notifyAll();

}

Page 14: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998

startWrite Entry Method

public synchronized void startWrite(int i) {

if (numReaders > 0 || numWriters > 0) {

numWaitingWriters++;

okToWrite = false;

while (!okToWrite)

try {wait();} catch (InterruptedException e) {}

numWaitingWriters--;

}

okToWrite = false;

numWriters++;

}

Page 15: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998

endWrite Entry Method

public synchronized void endWrite(int i) {

numWriters--; // ASSERT(numWriters==0)

okToWrite = numWaitingReaders == 0;

startWaitingReadersTime = age();

notifyAll();

}

Page 16: Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998

End The Monitor Declaration

} // End the class (just like any other)