前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >peek方法和remove方法实现代码

peek方法和remove方法实现代码

原创
作者头像
用户7999227
修改2021-10-08 15:01:38
修改2021-10-08 15:01:38
60300
代码可运行
举报
文章被收录于专栏:Java小王子Java小王子
运行总次数:0
代码可运行
peek方法

peek类操作其实比较简单。因为有一个head节点去维护当前的队首元素。只有判断先first(head的后继)是否为空就好。

代码语言:javascript
代码运行次数:0
运行
复制
    public E peek() {
        if (count.get() == 0)
            return null;
        final ReentrantLock takeLock = this.takeLock;
        takeLock.lock();
        try {
            Node<E> first = head.next;
            if (first == null)
                return null;
            else
                return first.item;
        } finally {
            takeLock.unlock();
        }
    }
remove方法
代码语言:javascript
代码运行次数:0
运行
复制
    public boolean remove(Object o) {
        if (o == null) return false;
        fullyLock();//获取存元素锁和取元素锁(不允许存或取元素),因为有可能同时涉及到头尾结点的访问问题
        try {
            for (Node<E> trail = head, p = trail.next; p != null; trail = p, p = p.next) {// 遍历整个链表
                if (o.equals(p.item)) {// 结点的值与指定值相等
                    unlink(p, trail); // 断开结点
                    return true;
                }
            }
            return false;
        } finally {
            fullyUnlock();
        }
    }

    void unlink(Node<E> p, Node<E> trail) {
        p.item = null; 
        trail.next = p.next;// 断开p结点
        if (last == p) // 尾节点为p结点
            last = trail; // 重新赋值尾节点
        if (count.getAndDecrement() == capacity)
            notFull.signal();
    }

    void fullyLock() {
        putLock.lock();
        takeLock.lock();
    }

    void fullyUnlock() {
        takeLock.unlock();
        putLock.unlock();
    }

LinkedBlockingQueue与ArrayBlockingQueue的比较

  1. ArrayBlockIngQueue,它使用循环数组实现,在创建时指定存储的大小,一定是有界的,如果不知道队列未来的大小,那么使用ArrayBlockingQueue就必然会导致数组的来回复制,降低效率;而LinkedBlockingQueue可以由用户指定最大存储容量,也可以无需指定,如果不指定则最大存储容量将是Integer.MAX_VALUE。
  2. ArrayBlockingQueue中在入队列和出队列操作过程中,使用的是同一个lock,所以即使在多核CPU的情况下,其读取和操作的都无法做到并行,而LinkedBlockingQueue的读取和插入操作所使用的锁是两个不同的lock,它们之间的操作互相不受干扰,因此两种操作可以并行完成,故LinkedBlockingQueue的吞吐量要高于ArrayBlockingQueue。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • peek方法
  • remove方法
  • LinkedBlockingQueue与ArrayBlockingQueue的比较
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档