私の下のメソッドのスレッドは安全ですか?このメソッドは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
メソッドはスレッドセーフであれば(スレッドセーフであれば)、そのようなsynchronizedブロックを使用するより良い方法はありますか?これらの操作のスレッドセーフな他のデータ構造ですか?私は.putIfAbsentはJava7であるので、あなたがそれを使用できるJava 7
ああ、申し訳ありませんが、それを逃した。 –
あなたの質問のタイトルは少し離れています。 ConcurrentHashMapをスレッドセーフにする必要はありません。すでに、スレッドセーフです。あなたがここでやろうとしているのは、_own_コードをスレッドセーフにすることです。 –
あなたは正しいと思います。 – john