Skip to content

SpscArrayQueue::offer may cause size to be greater than capacity #297

@hl845740757

Description

@hl845740757

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();
            }
        }

    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions