`
stephen80
  • 浏览: 105180 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java SynchronousQueue 似乎有的一个bug

    博客分类:
  • j2se
阅读更多
blockingQueue.put(E e); 会导致 e 变得不稳定。

代码如下:
                    logger.debug("put a q size :{}",pq.size());
returnSize=returnSize+pq.size();

frontier.getTodoQueue().put(pq);

pq.size is ok.

如果变为
             frontier.getTodoQueue().put(pq);
          logger.debug("put a q size :{}",pq.size());
  returnSize=returnSize+pq.size();

则 pg 以及 pq.size 变得不稳定.


我怀疑是java SynchronousQueue 的一个bug.

当然,也许是我对 SynchronousQueue 的理解,不到位。


分享到:
评论
1 楼 stephen80 2009-03-02  
是的。我的代码有问题。
引出程序设计的原则:
1.不要尽可能的利用已有对象,不要担心对象创建
2. 为了thread safe:
  考虑 :
    Caller copies
    Receiver copies:



相关推荐

    java 同步器SynchronousQueue详解及实例

    Java 中的同步器 SynchronousQueue 是一种特殊的阻塞队列,它最多只能放一个元素,这个元素如果不在特定的时间消费掉就会被删除,队列的长度始终为 0。SynchronousQueue 主要用于生产者消费者问题,下面是对 ...

    SynchronousQueue实现原理.pdf

    SynchronousQueue是Java中的一个阻塞队列实现,它在Java并发编程中扮演着重要的角色。SynchronousQueue特别之处在于它没有进行数据存储的能力,也就是说它的容量为0。其核心功能是用于线程之间的直接传递数据,实现...

    SynchronousQueue详解

    h InterruptedException ex) {...总的来说,SynchronousQueue是Java并发库中一个强大的工具,它可以提供高效、精确的线程间通信。尽管它有一定的学习曲线,但掌握它的使用可以显著提高多线程程序的性能和设计灵活性。

    java并发工具包 java.util.concurrent中文版用户指南pdf

    7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque 10. 并发 Map(映射) ConcurrentMap 11. 并发导航映射 ConcurrentNavigableMap 12. 闭锁 CountDownLatch 13. ...

    java并发工具包 java.util.concurrent中文版pdf

    `BlockingQueue` 是 `java.util.concurrent` 包中的一个接口,它扩展了传统的 `Queue` 接口,并引入了阻塞特性。这意味着当队列为空时,从队列中移除元素的操作将会阻塞;同样地,当队列满时,向队列添加元素的操作...

    java线程池threadpool简单使用源码

    Java线程池(ThreadPool)是Java并发编程中的一个重要概念,它可以帮助我们有效地管理和控制并发执行的任务,从而提高系统的效率和稳定性。线程池通过复用已存在的线程,避免了频繁创建和销毁线程带来的开销,同时也...

    Java 线程池.docx

    1. **CachedThreadPool**:这是一个可缓存线程池,会无限创建新线程,但如果线程在空闲5秒后仍未被使用,它将被终止。适用于需要大量短生命周期线程的场景。 2. **ScheduledThreadPool**:用于周期性执行任务,它...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版pdf

    SynchronousQueue则是一个不存储元素的阻塞队列,主要用于线程间的直接传递。 在编程实践中,使用BlockingQueue通常涉及到生产者和消费者模式,生产者线程负责向队列中添加元素,而消费者线程则负责从队列中取出...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版.pdf

    同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque 10. 并发 Map(映射) ConcurrentMap 11. 并发导航 映射 ConcurrentNavigableMap 12. 闭锁 CountDownLatch 13. ...

    SynchronousQueue核心属性和方法源码的分析

    SynchronousQueue核心属性和方法源码的分析的代码

    java并发编程.docx

    ThreadLocal是Java提供的一种线程局部变量,每个线程都有独立的副本,确保了线程间数据的隔离。使用ThreadLocal的场景包括: 1. 当每个线程需要独享一份变量,例如,每个线程需要自己的日期格式化对象,避免了多...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版

    本资源包含两个 pdf 文档,一本根据 Jakob Jenkov 最新博客 (http://tutorials.jenkov.com/java-util-concurrent/index.html) 整理的 java_util_concurrent_user_guide_en.pdf,一个中文翻译的 java_util_concurrent...

    Java并发大神Doug Lee同步队列论文

    在这种结构中,每个队列或栈都有一端用于插入数据,另一端用于移除数据。这种方式可以有效地减少线程之间的竞争,从而提高性能。 - **公平性**:作者还考虑了同步队列的公平性问题。公平的同步队列保证先进先出的...

    java线程大总结.pdf

    接着,Java 5引入了阻塞队列`BlockingQueue`,这是一个具有容量限制的队列,当队列满时,试图添加元素的线程会被阻塞,直到队列中有空位;同样,当队列为空时,尝试从队列中取出元素的线程也会被阻塞,直到有元素可...

    java线程池实例

    在实际开发中,Java还提供了一些预定义的线程池,如`Executors.newFixedThreadPool(int nThreads)`创建固定大小的线程池,`Executors.newSingleThreadExecutor()`创建只有一个线程的线程池等。这些预定义的线程池...

    java线程大总结[汇编].pdf

    每种实现都有其特定的特性,比如`ArrayBlockingQueue`是基于数组的,而`LinkedBlockingQueue`是基于链表的,`SynchronousQueue`则不是一个真正的队列,它在两个线程之间传递元素。 在上述代码示例中,我们看到了`...

    java 线程池源代码

    3. `newCachedThreadPool()`: 创建一个可缓存的线程池,当线程空闲超过60秒,线程会自动终止,适合处理大量短生命周期的任务。 4. `newScheduledThreadPool(int corePoolSize)`: 创建一个定长的线程池,支持定时及...

    java队列Java系列2021.pdf

    而队满的条件是当队头指针再次追上队尾指针时,但在循环队列中,由于有一个单元空间不存放数据,所以队满的条件也是队头指针等于队尾指针,这时数组实际上只使用了maxSize-1的空间。 操作主要有两种:进队(push)...

    java socket线程池

    在Java中,除了ArrayBlockingQueue之外,还有其他的队列实现,比如LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue等,它们的特性不同,在不同的场景下有不同的表现。 另外,处理拒绝任务的策略也很...

Global site tag (gtag.js) - Google Analytics