我的下面的方法線程安全嗎?這個方法在Singleton類中。如何使併發哈希映射線程安全地使用get和put作爲原子操作?
private static final Map<String, PreparedStatement> holder = new ConcurrentHashMap<>();
public BoundStatement getStatement(String cql) {
Session session = TestUtils.getInstance().getSession();
PreparedStatement ps = holder.get(cql);
if(ps == null) { // If "ps" is already present in cache, then we don't have to synchronize and make threads wait.
synchronized {
ps = holder.get(cql);
if (ps == null) {
ps = session.prepare(cql);
holder.put(cql, ps);
}
}
}
return ps.bind();
}
我與卡桑德拉工作,並使用datastax Java驅動程序,所以我重用準備好的語句,這就是爲什麼我在這裏將其高速緩存。 Prepared Statement和BoundStatement。
有沒有更好的方式使我的getStatement
方法線程安全(如果它是線程安全的),而不是像這樣使用同步塊?任何其他可能對這些操作都是線程安全的數據結構?我與Java 7
啊,對不起,錯過了。 –
您的問題的標題有點偏離。您不必使ConcurrentHashMap線程安全:它已經是線程安全的開箱即用。你想在這裏做的是讓你的_own_代碼線程安全。 –
是的,你是對的我猜。 – john