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