`
crazy木木木
  • 浏览: 51388 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ConcurrentLinkedQueue应该注意的地方

    博客分类:
  • java
 
阅读更多

刚开始认为使用了ConcurrentLinkedQueue类之后意味着不需要自己进行任何同步或加锁操作,查了下资料,
如果直接使用它提供的函数,比如:queue.add(obj); 或者 queue.poll(obj);,这样我们自己不需要做任何同步。
但如果是非原子操作,比如:
    if(!queue.isEmpty()) { 
    queue.poll(obj); 
   } 
我们很难保证,在调用了isEmpty()之后,poll()之前,这个queue没有被其他线程修改。
所以对于这种情况,我们还是需要自己同步:
  synchronized(queue) { 
     if(!queue.isEmpty()) { 
         queue.poll(obj); 
      } 
   } 

当然,如果是可以接受的脏读同样可以不用加synchronized

分享到:
评论

相关推荐

    ConcurrentLinkedQueue源码分析.rar

    《并发编程:深入剖析ConcurrentLinkedQueue》 在Java并发编程领域,`ConcurrentLinkedQueue`是一个非常重要的数据结构,它是线程安全的无界队列,基于链接节点实现,性能高效。本篇文章将深入探讨`...

    LinkedBlockingQueue 和 ConcurrentLinkedQueue的区别.docx

    值得注意的是,无界队列虽能动态扩展,但当系统内存耗尽时,仍可能导致`java.lang.OutOfMemory`错误。无界队列是否合适,取决于具体的应用场景和资源管理策略。 LinkedBlockingQueue实现了BlockingQueue接口,其...

    ConcurrentLinkedQueue

    ConcurrentLinkedQueue

    并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法

    ### 并发队列 ConcurrentLinkedQueue 和阻塞队列 LinkedBlockingQueue 用法详解 #### 一、并发队列 ConcurrentLinkedQueue 概述 `ConcurrentLinkedQueue` 是 Java 并发包 `java.util.concurrent` 提供的一个高性能...

    自己动手让springboot异步处理浏览器发送的请求(只需要使用ConcurrentLinkedQueue即可)

    需要注意的是,由于Spring Boot的异步方法默认返回的是`Future`类型,如果需要获取处理结果,可以通过`Future.get()`方法等待结果,但这会阻塞当前线程,所以一般用于回调或者非阻塞IO场景。 总结来说,结合`...

    聊聊并发(6)ConcurrentLinkedQueue的

    不过,需要注意的是,尽管其性能优秀,但在容量无限的队列中,如果生产速度远超消费速度,可能导致内存消耗过大,因此合理地控制生产与消费的平衡至关重要。 总结来说,`ConcurrentLinkedQueue`是Java并发库中的一...

    Java 线程 ? ConcurrentLinkedQueue

    ConcurrentLinkedQueue  在考虑并发的时候可以先考虑单线程的情况,然后再将并发的情况考虑进来。  比如ConcurrentLinkedQueue:  1、先考虑单线的offer  2、再考虑多线程时候的offer:  · 多个线程offer...

    Java 多线程与并发(15-26)-JUC集合- ConcurrentLinkedQueue详解.pdf

    ### Java多线程与并发(15-26)-JUC集合-ConcurrentLinkedQueue详解 #### 一、ConcurrentLinkedQueue概述 `ConcurrentLinkedQueue`是Java实用工具包(J.U.C)中的一个高性能线程安全队列,主要用于解决多线程环境下...

    Java concurrency集合之ConcurrentLinkedQueue_动力节点Java学院整理

    值得注意的是,ConcurrentLinkedQueue不允许存储`null`元素,除了其内部实现的特殊节点。 **数据结构与实现原理** ConcurrentLinkedQueue的内部结构基于链表。它有两个核心属性:head(头节点)和tail(尾节点),...

    线程安全的jdbc连接池

    在这个简单的实现中,我们利用了`ConcurrentLinkedQueue`数据结构来确保多线程环境下的安全性和效率。 首先,让我们了解什么是JDBC连接池。JDBC连接池(Java Database Connectivity Connection Pool)是数据库资源...

    Android代码-MutilDialogManger

    随着项目的不断迭代,加上产品经理大法(这里加一个弹窗提示,...为了防止多个线程同时操作DialogManager中的queue对象,所以我们采用线程安全的ConcurrentLinkedQueue,这里简单的介绍下ConcurrentLinkedQueue实现和数

    java.util.concurrent

    java.util.concurrent总体概览图。 收取资源分3分。需要的同学可以下载一下。 java.util.concurrent主要包括5个部分executor,colletions,locks,atomic,tools。 该图详细的列举了并发包下面的结构,包含所有接口和...

    Android eventbus

    private final ConcurrentLinkedQueue<Object> eventQueue = new ConcurrentLinkedQueue(); private ConcurrentHashMap, ConcurrentLinkedQueue<Subscriber>> subscribersMap = new ConcurrentHashMap(); public...

    实战Concurrent-BlockQueue

    本文将深入探讨`ConcurrentLinkedQueue`、`ArrayBlockingQueue`以及`LinkedBlockingQueue`这三种实现,并分析它们的设计原理与应用场景。 首先,我们来看`ConcurrentLinkedQueue`。它是基于非阻塞算法(CAS,...

    java 并发编程 多线程

    - 特别注意:如果对象的引用逃逸到了不受控制的地方,则可能引发数据不一致的问题。 #### 5. ThreadLocal与线程局部变量 - **ThreadLocal**:这是一个实用的类,用于在线程之间隔离变量,可以避免多个线程之间的...

    resource-pool:线程安全资源池

    可用和获取的资源在单独的数据结构中进行跟踪 - ConcurrentLinkedQueue。 ConcurrentLinkedQueue 提供无界数据结构,因此托管资源可以根据需要增长。 ConcurrentLinkedQueue 提供高效的多线程访问。 队列数据结构...

    Java并发编程相关源码集 包括多任务线程,线程池等.rar

    Java并发编程常见知识点源码集锦,涉及到对象锁,Executors多任务线程框架,线程池等... ConcurrentLinkedQueue、DelayQueue示例、自定义的线程拒绝策略、自定义线程池(使用有界队列)、自定义线程池(使用无界队列)。。。

    无锁队列

    在Java中,一个著名的无锁队列实现是`ConcurrentLinkedQueue`,它是Java并发包`java.util.concurrent`的一部分。这个队列基于循环队列的设计,利用了链表节点的CAS操作来实现元素的插入和移除。在`...

    多线程程序避免冲突的3条简单规则

    在多线程编程中,确保线程安全是至关重要的,因为并发执行的线程...然而,需要注意的是,过度的同步可能会导致性能下降,因此需要在安全性与性能之间找到平衡。通过合理的并发设计,可以构建出高效且健壮的多线程应用。

    JDK_seaswalker.tar.gz

    JDK源码阅读笔记 Condition CountDownLatch CyclicBarrier ...ConcurrentLinkedQueue ThreadPool ThreadLocal Reflection ScheduledThreadPool AsynchronousFileChannel BufferedInputStream Enum

Global site tag (gtag.js) - Google Analytics