我遇到的一种常见模式是需要从数据库刷新像List或HashMap这样的集合,但不希望在刷新之间添加或从中删除值。不可改变但可刷新的集合?
我最近在Google的Guava库中发现了ImmutableList和ImmutableMap,我非常喜欢它。但我不能对这些类型执行“clearAll()”,也不能重新填充它们。但我喜欢他们是不可改变的。
因此,如果我想强制执行这种“只对数据库进行可变刷新”的模式,那么我想每次都必须使用volatile变量。还是有更好的模式?这也可以在多线程环境中,并且我会确保refresh()上没有竞争条件。
public class MarketManager {
private volatile ImmutableList<Market> markets = null;
private MarketManager() {
}
public void refresh() {
marketList = //build a new immutable market list
}
public static MarketManager getInstance() {
MarketManager marketManager = new MarketManager();
marketManager.refresh();
return marketManager;
}
}
你可以使用'Collections.unmodifiableList()';从一个能够覆盖该列表的类中的方法返回它。 – fge 2014-10-29 16:52:01
但是如果我想要提高Guava实现的性能呢?我编写的应用程序使用了大量的集合和大量的内存。 – tmn 2014-10-29 16:53:11
应该指出'Collections.unmodifiableFoos()'返回原始'foo'的不可变视图,所以它们非常高效。 – Kayaman 2014-10-29 16:56:08