美文网首页
无锁数组队列

无锁数组队列

作者: 万福来 | 来源:发表于2020-06-02 19:20 被阅读0次

无锁数组队列

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

    }

相关文章

  • 无锁数组队列

    无锁数组队列

  • 无锁队列

    简介 无锁队列是lock-free中最基本的数据结构,一般应用场景是资源分配,比如TimerId的分配,Worke...

  • 无锁队列

    rte_ring 关键点 无锁: rte_atomic32_cmpset 直到成功(CAS)环: 总长度c...

  • 七个阻塞队列

    ArrayBlockingQueue 基于数组的有界阻塞队列 使用单锁 LinkedBlockingQueue 基...

  • 无锁环形队列

    并发编程中,经常会遇到资源竞争问题,而保持竞争资源的正确使用,可以通过锁的方式,但synchronized blo...

  • JUC并发集合总结

    ConcurrentLinkedQueue 线程安全的支持高并发的队列,使用链表实现。非阻塞,无锁,无界。该队列也...

  • 多线程之非阻塞队列

    ConcurrentLinkedQueue 相对于阻塞队列加锁实现阻塞,非阻塞队列采用无锁CAS的方式来实现。

  • 1.数组队列

    数组实现单队列 数组实现循环队列

  • 无锁队列的总结

    首次接触无锁数据结构的设计,请各位大佬多多指教~~~ CAS(Compare && Swap)原子操作 CAS是无...

  • 无锁队列C实现

    入队列 我们可以看到,程序中的那个 do- while 的 Re-Try-Loop。就是说,很有可能我在准备在队列...

网友评论

      本文标题:无锁数组队列

      本文链接:https://www.haomeiwen.com/subject/owspzhtx.html