Java 跨多个线程共享映射属性

Java 跨多个线程共享映射属性,java,multithreading,Java,Multithreading,这里给出了一个多线程环境。下面是一个带有Map属性的伪类,在创建实例时使用值初始化该类。映射的键是一个字符串,而值是一个布尔值,这将指示相应的条目当前是由其他人(另一个线程)使用,还是免费使用。我希望这个映射在所有访问线程之间共享,条件是每个人都可以立即看到条目更新是否发生(指示各自的条目刚刚被拾取或释放)。实现这一目标的适当和最安全的方法是什么? 如果我将map属性标记为volatile,而这两个方法是同步的,那么它会起作用吗?(下一步是使用等待逻辑对其进行增强,因此如果没有可用的条目,线程可

这里给出了一个多线程环境。下面是一个带有Map属性的伪类,在创建实例时使用值初始化该类。映射的键是一个字符串,而值是一个布尔值,这将指示相应的条目当前是由其他人(另一个线程)使用,还是免费使用。我希望这个映射在所有访问线程之间共享,条件是每个人都可以立即看到条目更新是否发生(指示各自的条目刚刚被拾取或释放)。实现这一目标的适当和最安全的方法是什么? 如果我将map属性标记为volatile,而这两个方法是同步的,那么它会起作用吗?(下一步是使用等待逻辑对其进行增强,因此如果没有可用的条目,线程可以等到某个时间段后再抛出异常。)

公共类虚拟{
私有地图共享地图;
公共假人(){
this.sharedMap=newhashmap(){{
put(“key1”,Boolean.FALSE);
put(“key2”,布尔值。FALSE);
put(“key3”,布尔值。FALSE);
put(“key4”,Boolean.FALSE);
put(“键5”,布尔值。FALSE);
put(“键6”,布尔值。FALSE);
}};
}
公共字符串getFreeEntry()引发CustomException{
Map.Entry=this.sharedMap.entrySet().stream()
.filter(x->Boolean.FALSE.equals(x.getValue()))
.findFirst().OrelsThrow(CustomException::new);
entry.setValue(Boolean.TRUE);
return entry.getKey();
}
公共无效释放条目(字符串键){
this.sharedMap.put(key,Boolean.FALSE);
}
}

您可以查看线程安全的
ConcurrentHashMap

一个哈希表,支持检索的完全并发性和更新的高预期并发性。这个类遵循与Hashtable相同的功能规范,并且包括与Hashtable的每个方法对应的方法版本。但是,即使所有操作都是线程安全的,检索操作也不需要锁定,并且不支持以阻止所有访问的方式锁定整个表。该类在依赖于其线程安全性而不依赖于其同步细节的程序中与哈希表完全互操作

任何数量的线程都可以执行检索操作,但一次最多只能使用一个线程进行更新。这个线程必须锁定线程想要操作的特定段

请注意,在
ConcurrentHashMap
中不能将空对象作为键或值插入。

public class Dummy {

    private Map<String, Boolean> sharedMap;

    public Dummy() {
        this.sharedMap = new HashMap<String, Boolean>(){{
            put("key1", Boolean.FALSE);
            put("key2", Boolean.FALSE);
            put("key3", Boolean.FALSE);
            put("key4", Boolean.FALSE);
            put("key5", Boolean.FALSE);
            put("key6", Boolean.FALSE);
        }};
    }

    public String getFreeEntry() throws CustomException {
        Map.Entry<String, Boolean> entry = this.sharedMap.entrySet().stream()
            .filter(x -> Boolean.FALSE.equals(x.getValue()))
            .findFirst().orElseThrow(CustomException::new);
        entry.setValue(Boolean.TRUE);
        return entry.getKey();
    }

    public void releaseEntry(String key) {
        this.sharedMap.put(key, Boolean.FALSE);
    }

}