Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不常写和频繁读_Java_Multithreading_Jedis - Fatal编程技术网

Java 不常写和频繁读

Java 不常写和频繁读,java,multithreading,jedis,Java,Multithreading,Jedis,我有下面的JedisCluster impl,我想使线程安全- public class Cluster { private List<String> hostPorts; private Map<String, JedisPool> hostPool = new ConcurrentHashMap<String, JedisPool>(); public add(String node) {

我有下面的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);
    }
公共类集群{
私有列表主机端口;
私有映射主机池=
新的ConcurrentHashMap();
公共添加(字符串节点){
添加(节点);
添加(节点,创建_池);
} 
公共删除(字符串节点){
删除(节点);
JedisPool pool=hostPool.remove(节点)
pool.destroy();
}
公共字符串getMaster(字符串键){
返回hostPorts.get(一些散列()%hostPool.size());
}
公共池(字符串节点){
返回rediHostPool.get(节点);
}
以下是线程-

  • 1写入线程,该线程将在节点运行时更新状态 从集群中添加/删除-这种情况很少发生
  • 1个读取线程,该线程将频繁读取并调用getMaster()和 getPool()
我想知道使用并发处理上述场景的最佳策略。我想避免在方法级别进行同步,因为读取非常频繁。

使用a,通常意味着:

ReadWriteLock
维护一对关联锁,一个用于只读操作,一个用于写入。只要没有写入程序,读锁可以由多个读线程同时持有。写锁是独占的


一般来说,您应该只同步代码的“关键部分”,即访问共享数据的最小代码部分。您没有告诉我们哪些数据是共享的,但我猜是
主机端口
主机池
,它们应该是
最终的
。如果这是正确的,您的整个
getMaster
getPool
add
方法体需要在您使用的任何监视器或锁上同步,并且
remove
方法中的两个
remove
调用需要同时位于一个同步块中。(
add
remove
在您的示例中不会编译。)即使我在add/remove中使用writeLock,在getMaster/getPool中使用readLock,也会出现以下情况,无法避免损坏-1]读卡器获取master 2]写卡器删除节点(与读卡器先前获取的节点相同)3]读卡器调用getPool,传递在步骤1]中获取的主机,该主机在步骤2]中被删除时将返回null]