假设我有List
角色缓存。大多数时间列表是只读每隔几秒就要购买原子替换所有列表内容。
在原子上我的意思是我不想让缓存客户端在例如clear()
和addAll()
之间进行读取。
要使用哪个列表实现以及如何执行替换以获得最佳性能?
最好替换列表内容或替换参考值本身?
答案 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,因为它是线程安全的。