gpt4 book ai didi

Java(Android),线程安全的FIFO,无需锁定?

转载 作者:行者123 更新时间:2023-12-02 05:20:50 24 4
gpt4 key购买 nike

我有一个只有两个线程的生产者-消费者情况。一个从池中取出对象并将它们放入 fifo,另一个读取对象(一次多个),进行计算,将它们从列表中删除并将它们放回池中。
使用 ConcurrentLinkedQueue 该模式应该是线程安全的,无需额外的锁。每个对象仅写入一次、读取一次并删除一次。 Add() 和 Poll() 在 CLQ 中是安全的。
a) 这是正确的吗?
b) 还有哪些其他容器支持此特定模式?我记得 LinkedList 甚至 ArrayList 是安全的,因为“getSize()”或“head=...”的一些原子效应,但我不确定,也找不到它。

最佳答案

  1. 是的,ConcurrentLinkedQueueaddpoll 方法是线程安全的(与所有其他方法一样)。
  2. 不,不要在并发环境中直接使用 ArrayListLinkedList。根据定义,这些类不是线程安全的:

Note that this implementation is not synchronized. If multiple threads access an ArrayList instance concurrently, and at least one of the threads modifies the list structurally, it must be synchronized externally.

如果您对 ConcurrentLinkedQueue 不满意,请查看包 java.util.concurrent 中的所有容器实现。 :

  • ConcurrentLinkedDeque(是一个队列)
  • LinkedBlockingQueue(是一个BlockingQueue)
  • LinkedBlockingDeque(是一个BlockingDeque)
  • ArrayBlockingQueue(是一个BlockingQueue)

我假设,QueueBlockingQueue 是您选择的接口(interface)。

关于Java(Android),线程安全的FIFO,无需锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26528450/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com