为了账号安全,请及时绑定邮箱和手机立即绑定

检查大小然后执行操作-ConcurrentLinkedDeque是否安全?

检查大小然后执行操作-ConcurrentLinkedDeque是否安全?

HUX布斯 2021-05-11 13:14:13
Deque仅当大小将超过限制时,才需要用新值替换第一个值。我写了这段代码来解决它:final class Some {    final int buffer;    final Deque<Operation> operations = new ConcurrentLinkedDeque<>();    // constructors ommited;    @Override    public void register(final Operation operation) {        if (this.operations.size() == this.buffer) {            // remove the oldest operation            this.operations.removeFirst();        }        // add new operation to the tail        this.operations.addLast(operation);    }    @Override    public void apply() {        // take the fresh operation from tail and perform it        this.operations.removeLast().perform();    }}如您所见,我有两种方法可以修改Deque。我对此代码是否可以在多线程环境中正常运行感到怀疑。问题是:检查size()并随后执行修改ConcurrentLinkedDeque后的操作是否安全?我想要尽可能少的锁。因此,如果此代码行不通,那么我不得不引入锁定功能,那么使用毫无意义ConcurrentLinkedDeque()。final class Some {    final int buffer;    final Deque<Operation> operations = new LinkedList<>();    final Lock lock = new ReentrantLock();    // constructors ommited;    @Override    public void register(final Operation operation) {        this.lock.lock();        try {            if (this.operations.size() == this.buffer) {                // remove the oldest operation                this.operations.removeFirst();            }            // add new operation to the tail            this.operations.addLast(operation);        } finally {            lock.unlock();        }    }    @Override    public void apply() {        this.lock.lock();        try {            // take the fresh operation from tail and perform it            this.operations.removeLast().perform();        } finally {            this.lock.unlock();        }    }}这是的替代选择Lock。那是实现我想要的唯一途径吗?我对尝试使用并发集合特别感兴趣。
查看完整描述

2 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

从文档的size()

注意,与大多数集合不同,此方法不是恒定时间操作。由于这些双端队列的异步性质,确定当前元素数量需要遍历所有元素以进行计数。此外,在执行此方法期间大小可能会更改,在这种情况下,返回的结果将不准确。因此,该方法在并发应用程序中通常不是很有用。

尽管@Slaw是正确的,但还请注意,遍历过程中可能会发生加法/减法。

我不在软件中使用size()。我使用AtomicInteger自己计算集合中的内容。如果count.get()<max,我可以添加。对于我的使用来说,最大超出一点是可以的。您可以使用计数锁定来强制遵从。


查看完整回答
反对 回复 2021-05-26
  • 2 回答
  • 0 关注
  • 130 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信