流过滤器螺纹安全

时间:2018-08-10 04:02:45

标签: java

我想知道这段代码是否会遇到竞争条件或并发问题:

public User getByName(String name) {
   characters.values().stream().filter(chr -> chr.getName().equalsIgnoreCase(name)).findAny().orElse(null)); 
}

其中的字符是:

private final Map<Integer, Player> characters = new HashMap<>();

这里需要使用ReentrantReadWriteLock吗?基本上,这是我的游戏的一种字符存储,我可以在其中添加和删除字符对象。 (通过放置/删除)。

1 个答案:

答案 0 :(得分:2)

流不保证任何线程安全。如果您使用的是类成员(如您的情况),则必须确保在末尾管理线程。但是,如果在lambda表达式中使用局部变量,则其他线程看不到这些变量。另外,请注意,使characters最终只能保证不能重新分配变量。仍可以更改map本身。有关更多详细信息,您甚至可以查看this answer

编辑: 根据{{​​3}}:

  

行为参数的行为对流操作的影响   一般的,灰心丧气的,因为他们经常会导致无意识的违规   无状态要求以及其他线程安全性   危害。

最重要的是使用术语行为参数,这意味着保持类的状态(成员变量)。