如何以原子方式检查 ArrayList 是否包含元素? [重复]

问题描述 投票:0回答:1

比方说,我们正在尝试将几个元素添加到一个

ArrayList
中。同时,正在搜索同一个列表
list.contains(givenElement)
.

那么,我们如何在不锁定整个

list
对象的情况下实现线程安全呢? 换句话说,多个线程如何访问这个列表并执行操作
atomically
?我想知道如何使用
AtomicReference
.

来实现这一点

我可以创建一个

AtomicReference
变量,其中加载了
list
。但是,那么我如何在不对整个
contains()
compareAndSet()
的情况下原子地执行
list
操作?

请注意,我正在寻找使用线程安全集合以外的解决方案。

java multithreading thread-safety atomic
1个回答
0
投票

如果列表本身没有改变,那么您不应该查看 AtomicReference。

看来你需要

ReadWriteLock
,允许多个线程一次检查列表,同时在列表更改期间锁定。

要检查它是否在列表中,您需要

Lock readLock()
并更改它
Lock writeLock()
.

这种用法有很多例子。

在 OP 的评论之后:可以进行不只是比较的更改。

获取readLock,看是否包含在链表中,如果一定要添加到链表中,则获取writeLock。只有在需要更改时才获取 writeLock。

© www.soinside.com 2019 - 2024. All rights reserved.