我有我要讓線程安全以下JedisCluster IMPL -不經常寫和頻繁的讀取
public class Cluster {
private List<String> hostPorts;
private Map<String, JedisPool> hostPool =
new ConcurrentHashMap<String, JedisPool>();
public add(String node) {
hostPorts.add(node);
hostPool.add(node, create_pool);
}
public remove(String node) {
hostPorts.remove(node);
JedisPool pool = hostPool.remove(node)
pool.destroy();
}
public String getMaster(String key) {
return hostPorts.get(some_hash() % hostPool.size());
}
public JedisPool getPool(String node) {
return redisHostPool.get(node);
}
以下是線程 -
- 1寫線程將更新狀態時一個節點是 添加/從集羣中刪除 - 這種情況很少發生
- 1讀線程將頻繁閱讀調用getMaster()和 getPool()。
我想知道使用併發處理上述場景的最佳策略。我想避免在方法級別同步,因爲讀取非常頻繁。
通常,您應該只同步代碼的_critical section_s,即訪問共享數據的最小代碼段。你沒有告訴我們哪些數據是共享的,但我猜'hostPorts'和'hostPool',應該是'final'。如果這是正確的,你的整個'getMaster','getPool'和'add'方法體需要在你使用的任何監視器或鎖上進行同步,並且'remove'方法內的兩個'remove'調用需要處於同步塊一起。 (在你的例子中'add'和'remove'不會編譯。) –