write and read sequence volatile

This commit is contained in:
priyank-sriv 2020-06-15 18:44:01 +05:30
parent 5263fbf070
commit a4efb737a8
1 changed files with 21 additions and 24 deletions

View File

@ -1,28 +1,36 @@
package com.baeldung.circularbuffer; package com.baeldung.circularbuffer;
public class CircularBuffer<E> { public class CircularBuffer<E> {
private static final int DEFAULT_CAPACITY = 8;
private int capacity, writeIndex, readIndex; private final int capacity;
private E[] data; private final E[] data;
private volatile int writeSequence, readSequence;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public CircularBuffer(int capacity) { public CircularBuffer(int capacity) {
this.capacity = capacity; this.capacity = (capacity < 1 ? DEFAULT_CAPACITY : capacity);
this.data = (E[]) new Object[capacity]; this.data = (E[]) new Object[capacity];
this.readIndex = 0; this.readSequence = 0;
this.writeIndex = -1; this.writeSequence = -1;
} }
/**
* Adds a new element to the buffer, if the buffer is not full
* @param element
* @return
*/
public boolean offer(E element) { public boolean offer(E element) {
if (!isFull()) { if (!isFull()) {
writeIndex += 1; int nextWriteSeq = writeSequence + 1;
int nextWriteIndex = writeIndex % capacity; data[nextWriteSeq % capacity] = element;
data[nextWriteIndex] = element;
writeSequence += 1;
return true; return true;
} }
@ -33,20 +41,9 @@ public class CircularBuffer<E> {
if (!isEmpty()) { if (!isEmpty()) {
int nextReadIndex = readIndex % capacity; E nextValue = data[readSequence % capacity];
readIndex += 1; readSequence += 1;
return nextValue;
return data[nextReadIndex];
}
return null;
}
public E peek() {
if (!isEmpty()) {
return data[readIndex % capacity];
} }
return null; return null;
@ -58,12 +55,12 @@ public class CircularBuffer<E> {
public int size() { public int size() {
return (writeIndex - readIndex) + 1; return (writeSequence - readSequence) + 1;
} }
public boolean isEmpty() { public boolean isEmpty() {
return writeIndex < readIndex; return writeSequence < readSequence;
} }
public boolean isFull() { public boolean isFull() {