У меня есть следующая реализация JedisCluster, которую я хочу сделать потокобезопасной:
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().
Я хочу знать лучшую стратегию для обработки описанного выше сценария с использованием параллелизма. Я хотел бы избежать синхронизации на уровне метода, так как чтение происходит очень часто.
hostPorts
иhostPool
должно бытьfinal
. Если это так, все ваши тела методовgetMaster
,getPool
иadd
должны быть синхронизированы на любом мониторе или блокировке, которые вы используете, а два вызоваremove
в методеremove
должны быть вместе в синхронизированном блоке. (add
иremove
в вашем примере не скомпилируются.) - person Lew Bloch   schedule 16.06.2017