Fast Flow....
soRefElement(buffer, offset, e);
soProducerIndex(producerIndex + 1); // ordered store -> atomic and ordered for size()
Exception in thread "Thread-0" java.lang.IllegalStateException: size : 9, capacity : 8
at com.wjybxx.fastjgame.concurrenttest.SpscArrayQueueSizeTest$Producer.run(SpscArrayQueueSizeTest.java:62)
public class SpscArrayQueueSizeTest {
private static volatile boolean stop = false;
public static void main(String[] args) throws InterruptedException {
MessagePassingQueue<String> messageQueue = new SpscArrayQueue<>(8);
new Producer(messageQueue).start();
new Consumer(messageQueue).start();
try {
Thread.sleep(5 * 1000);
} finally {
stop = true;
}
}
private static class Producer extends Thread {
final MessagePassingQueue<String> messageQueue;
long sequence = 0;
Producer(MessagePassingQueue<String> messageQueue) {
this.messageQueue = messageQueue;
}
@Override
public void run() {
while (!stop) {
messageQueue.offer(Long.toString(sequence++));
int size = messageQueue.size();
int capacity = messageQueue.capacity();
if (size > capacity) {
throw new IllegalStateException("size : " + size + ", capacity : " + capacity);
}
}
}
}
private static class Consumer extends Thread {
final MessagePassingQueue<String> messageQueue;
private Consumer(MessagePassingQueue<String> messageQueue) {
this.messageQueue = messageQueue;
}
@Override
public void run() {
while (!stop) {
messageQueue.poll();
Thread.yield();
}
}
}
}
Fast Flow....