比方说,我们正在尝试将几个元素添加到一个
ArrayList
中。同时,正在搜索同一个列表list.contains(givenElement)
.
那么,我们如何在不锁定整个
list
对象的情况下实现线程安全呢?
换句话说,多个线程如何访问这个列表并执行操作atomically
?我想知道如何使用AtomicReference
.来实现这一点
我可以创建一个
AtomicReference
变量,其中加载了 list
。但是,那么我如何在不对整个contains()
做compareAndSet()
的情况下原子地执行list
操作?
请注意,我正在寻找使用线程安全集合以外的解决方案。
如果列表本身没有改变,那么您不应该查看 AtomicReference。
看来你需要
ReadWriteLock
,允许多个线程一次检查列表,同时在列表更改期间锁定。
要检查它是否在列表中,您需要
Lock readLock()
并更改它Lock writeLock()
.
这种用法有很多例子。
在 OP 的评论之后:可以进行不只是比较的更改。
获取readLock,看是否包含在链表中,如果一定要添加到链表中,则获取writeLock。只有在需要更改时才获取 writeLock。