原子替换Java中List中所有内容的最佳方法是什么?

时间:2014-03-21 13:29:07

标签: java list caching collections concurrency

假设我有List角色缓存。大多数时间列表是只读每隔几秒就要购买原子替换所有列表内容。

在原子上我的意思是我不想让缓存客户端在例如clear()addAll()之间进行读取。

要使用哪个列表实现以及如何执行替换以获得最佳性能?

最好替换列表内容或替换参考值本身?

2 个答案:

答案 0 :(得分:3)

Java有一个ReadWriteLock,它支持并发读取和独占写入。正如JavaDoc中所提到的,如果更新不是经常发生并且经常进行读取,那么它是一个很好的选择。作者更新List的速度越快,获得的效果就越好。

readLock()方法必须由读者调用,writeLock()必须由编写者调用。然后你必须在获得的锁上调用lock()。如果可用,胎面将继续工作,否则它将阻塞,直到锁定可用。

在构造ReadWriteLock时使用公平性,以使读取器和写入器线程能够按照它们请求的顺序获取锁定。否则一些线程可能会永远等待(在最坏的情况下)。

ReadWriteLock的好处是许多读者可能在没有获得它的情况下共享同一个锁,这是一个广泛的操作。只有当阅读和写作之间的比例大大有利于阅读时,才能观察到这种好处。

答案 1 :(得分:0)

如果您真的想将List<>类型用于缓存,可以使用如下锁定:

private static final Objet cacheLock  = new Object();


 public void updateListCache()
 {
    synchronized(lock)
    {
       //update your list cache
    }

 }

您的读取操作也需要实现此锁定,否则它将没有多大用处。

但是出于缓存目的,我会亲自使用ConcurrentHashMap,因为它是线程安全的。