java - 不可变但可刷新的集合?

标签 java multithreading concurrency guava

我遇到的一个常见模式是需要从数据库中刷新 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():

public class MarketManager {

     private volatile List<Market> markets = Collections.emptyList();

     private MarketManager() { 
     }

     public void refresh() { 
         marketList = //build a new market list
     }

     public List<Market> getMarkets() {
         return Collections.unmodifiableList(markets);
     }

     // ...
}

Collections.unmodifiableList() 简单地包装了任何 List 实现,以便所有变异操作都被“禁用”(也就是说,它们抛出异常)。

关于java - 不可变但可刷新的集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26636178/

相关文章:

Java 空检查

java - 在膨胀的布局上创建 onClick 事件

c++ - 在 Visual C++ 上,我如何处理带有线程的图像数组(并行)

java - 通过多个线程删除 java.util.Collection 元素

perl - Perl 线程与内核线程具有相同的优点吗?

java - 通过在运行时更改监视器,两个线程进入同步块(synchronized block)

java - JButton 不工作[捕获网络流量]

java - 将 String[] 更改为 Vector<String>

Java - 在 BLOB 文件中保存数据

java - 客户端 JMS 配置 - JMS 集群 - 仅连接到一台服务器