美文网首页
环形队列RingBuffer--Java实现

环形队列RingBuffer--Java实现

作者: 曾泽浩 | 来源:发表于2018-12-06 22:35 被阅读0次

在多线程并发中,程序为了保证线程的安全,通常需要加锁。那有没有一种数据结构能够实现不加锁的线程安全呢?有,就是大名鼎鼎的环形队列RingBuffer。代码来自日志框架log4j的CyclicBuffer,稍微改了一点点。


public class RingBuffer<T> {
    private  Object[] elements;
    private int first;
    private int last;
    private int numElems;
    private int maxSize;

    private static final int DEFAULT_SIZE = 1024;

    public RingBuffer() {
        this(DEFAULT_SIZE);
    }

    public RingBuffer(int maxSize) {
        if (maxSize < 1) {
            throw new IllegalArgumentException("The maxSize argument ("+maxSize+
                    ") is not a positive integer.");
        }

        this.maxSize = maxSize;
        elements = new Object[maxSize];
        this.first = 0;
        this.last = 0;
        numElems = 0;
    }

    /**
     * 添加元素
     * @param element
     */
    public void add(T element) {
        elements[last] = element;
        if (++last == maxSize) {
            last = 0;
        }
        if (numElems < maxSize) {
            numElems++;
        }
        else if (++first == maxSize) {
            first = 0;
        }
    }

    /**
     * 获取元素
     * @param i
     * @return
     */
    public T get(int i) {
        if (i < 0 || i >= numElems) {
            return null;
        }
        return (T)elements[(first + i) % maxSize];
    }

    /**
     * 获取最大的长度
     * @return
     */
    public int getMaxSize() {
        return maxSize;
    }

    /**
     * 获取当前元素
     * @return
     */
    public T get() {
        Object ele = null;
        if (numElems > 0) {
            numElems--;
            ele = elements[first];
            if (++first == maxSize) {
                first = 0;
            }
        }
        return (T)ele;
    }

    /**
     * 长度
     * @return
     */
    public int length() {
        return numElems;
    }

    /**
     * 扩容
     * @param newSize
     */
    public void resize(int newSize) {
        if (newSize < 0) {
            throw new IllegalArgumentException("Negative array size ["+newSize+
                    "] not allowed.");
        }

        if (newSize == numElems) {
            return;
        }

        Object[] temp = new Object[newSize];
        int loopLen = newSize < numElems ? newSize : numElems;
        for (int i = 0; i < loopLen; i++) {
            temp[i] = elements[first];
            elements[first] = null;
            if (++first == numElems) {
                first = 0;
            }
        }
        elements = temp;
        first = 0;
        numElems = loopLen;
        maxSize = newSize;
        if (loopLen == newSize) {
            last = 0;
        } else {
            last = loopLen;
        }
    }

}

相关文章

  • 环形队列RingBuffer--Java实现

    在多线程并发中,程序为了保证线程的安全,通常需要加锁。那有没有一种数据结构能够实现不加锁的线程安全呢?有,就是大名...

  • 数组实现环形队列

    利用数组结构在队列的基础下用取模算法来实现环形队列。 环形队列拥有复用功能。 主要算法思想:1)front指向队列...

  • 数据结构

    稀疏数组 代码实现: 队列 代码实现: 环形队列 什么时候队列满:(rear+1)%maxsize == fron...

  • 2020-11-10-数据结构与算法-14(队列scala版)

    1.队列 非环形实现 2.队列环形版 核心思想: 用%来模拟循环(rear +1) /maxsize = firs...

  • Disruptor:高性能的生产者-消费者的无锁实现

    Disruptor: 在Disruptor中使用环形队列RingBuffer来代替普通的线性队列(内部实现是普通的...

  • JS实现环形队列

    GitHub: https://github.com/BadWaka/data-structure-algorit...

  • 数组实现环形队列

    我这里实现的是循环队列 front:指向第一个数据的位置rear:指向最后一个数据的下一个位置maxSize:数组...

  • 数据结构之队列

    什么是队列 队列是一个有序列表, 可以用数组或链表实现 先入先出 使用数组模拟队列和环形队列 用数组模拟队列 思路...

  • workQueue有以下七种选择

    : ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列(数组结构可配合指针实现一个环形队列)。...

  • rte_ring

    dpdk的rte_ring实现的无锁队列,支持多生产者多消费者; 实现上使用了cas原子操作,结构是环形队列,思路...

网友评论

      本文标题:环形队列RingBuffer--Java实现

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