代码之家  ›  专栏  ›  技术社区  ›  Steve Kuo

LinkedBlockingQueue的insert和remove方法是线程安全的吗?

  •  51
  • Steve Kuo  · 技术社区  · 16 年前

    我在用 LinkedBlockingQueue 在两条不同的线之间。一个线程通过 add ,而另一个线程通过 take .

    我的问题是,我需要同步访问 添加 和 拿 . 是 LinkedBlockingQueue 的insert和remove方法线程安全吗?

    3 回复  |  直到 10 年前
        1
  •  54
  •   Guido    15 年前

    对.从 the docs :

    “阻塞队列实现是 线程安全。所有排队方法 用原子的方法达到它们的效果 内部锁或其他形式的 并发控制。但是,大部分 收集操作addall, 包含所有、保留和移除 不一定执行 原子的除非另有规定 在一个实现中。就是这样 可能,例如,对于addall(c) 失败 只在中添加一些元素 C.

        2
  •  11
  •   Ravindra babu    10 年前

    对, BlockingQueue 方法 add() 和 take() 线程安全吗 但有一点不同 .

    add () 和 () 方法使用2个不同的 ReentrantLock 物体。

    add( )方法使用

    private final ReentrantLock putLock = new ReentrantLock();
    

    () 方法使用

    private final ReentrantLock takeLock = new ReentrantLock();
    

    因此,同时访问 加法() 方法已同步。同样,同时访问 () 方法是 synchronized .

    但是,同时访问 加法() 和 () 方法不是 同步的 因为它们使用两个不同的锁对象(队列满/空的边缘条件除外)。

        3
  •  0
  •   Java Guru    10 年前

    简单地说是的,它绝对是线程安全的,否则它就不能作为存储 线程池 .

    只需添加和检索元素,而不必担心blockingqueue的并发性。