无锁数组队列

无锁数组队列

static class FreeLockArrayQueue<E> {
        private AtomicReferenceArray<E> queue;
        private AtomicInteger putIndex;
        private AtomicInteger takeIndex;
        private int size;

        FreeLockArrayQueue(int size) {
            this.size = size;
            queue = new AtomicReferenceArray<E>(size);
            putIndex = new AtomicInteger(0);
            takeIndex = new AtomicInteger(0);
        }

        public void put(E e) {
            for (; ; ) {
                int curr = putIndex.get();
                if (queue.compareAndSet(curr % size, null, e)) {
                    putIndex.incrementAndGet();
                    break;
                }
                if (putIndex.get() < takeIndex.get() + size) {
                    putIndex.incrementAndGet();
                }else{
                    LockSupport.parkNanos(this, 3000L);
                }
            }

        }

        public E take() {
            for (; ; ) {
                int curr = takeIndex.get();
                if (curr <= putIndex.get()) {
                    E expect = queue.get(curr % size);
                    if (expect != null && queue.compareAndSet(curr % size, expect, null)) {
                        takeIndex.incrementAndGet();
                        return expect;
                    }
                }
                Thread.currentThread().yield();
                if (takeIndex.get() < putIndex.get()) {
                    takeIndex.incrementAndGet();
                }else{
                    LockSupport.parkNanos(this, 3000L);
                }
            }
        }

    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容