【发布时间】:2016-11-24 21:51:03
【问题描述】:
我有一个下面的 Singleton 类,在我的 getStatement 方法中,我通过执行 if 检查来填充 CHM。
public class CacheHolder {
private static final Map<String, PreparedStatement> holder = new ConcurrentHashMap<>();
private static class Holder {
private static final CacheHolder INSTANCE = new CacheHolder();
}
public static CacheHolder getInstance() {
return Holder.INSTANCE;
}
private CacheHolder() {}
public BoundStatement getStatement(String cql) {
Session session = TestUtils.getInstance().getSession();
PreparedStatement ps = holder.get(cql);
if (ps == null) {
ps = session.prepare(cql);
holder.put(cql, ps);
}
return ps.bind();
}
}
我的getStatement 方法线程安全吗?
【问题讨论】:
-
我建议使用Guava cache 而不是 CHM,因为它带有原子的“get-if-absent-compute”语义,这正是您想要的。
-
PreparedStatement和BoundStatement是什么?在 javadoc 中,我没有看到任何bind方法,所以它不是java.sql.PreparedStatement。为什么这很重要?因为知道最终对象本身是否是线程安全的很重要。如果是,那么很好,但如果不是,那么你就有问题了,因为你确保创建它是线程安全的,但你的对象本身不是?嗯...不确定我更喜欢那个... -
我正在使用 Cassandra,所以我必须重新使用准备好的语句,这就是我在这里缓存它的原因。 Prepared Statement 和 BoundStatement
标签: java multithreading thread-safety guava concurrenthashmap