if I have a byte queue where it is expected that there will be one thread maker, another consumer:
class ByteQueue{
byte[] buf;
int readIdx;
int writeIdx;
Runnable writeListener;
Runnable readListener;
void write( byte[] b ){
int wr = writeIdx;
int rd = readIdx;
writeIdx = ( wr + b.length ) % buf.length;
writeListener.run();
}
void read( byte[] b ){
int wr = writeIdx;
int rd = readIdx;
readIdx = ( rd + b.length ) % buf.length;
readListener.run();
}
int available() { return (writeIdx - readIdx) % buf.length; }
int free() { return buf.length - available() -1; }
}
This type of queue does not require synchronization.
readIdx is modified only through the stream of readers,
writeIdx only by the stream of writing.
readIdx == writeIdx means that there is no content.
And the queue can only process data buf.length-1 bytes.
Are volatiles required or can they be eliminated, since only one stream is a modifier of one integer state?
THX Frank
source
share