我想知道这段代码是否会遇到竞争条件或并发问题:
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吗?基本上,这是我的游戏的一种字符存储,我可以在其中添加和删除字符对象。 (通过放置/删除)。
答案 0 :(得分:2)
流不保证任何线程安全。如果您使用的是类成员(如您的情况),则必须确保在末尾管理线程。但是,如果在lambda表达式中使用局部变量,则其他线程看不到这些变量。另外,请注意,使characters
最终只能保证不能重新分配变量。仍可以更改map
本身。有关更多详细信息,您甚至可以查看this answer。
编辑: 根据{{3}}:
行为参数的行为对流操作的影响 一般的,灰心丧气的,因为他们经常会导致无意识的违规 无状态要求以及其他线程安全性 危害。
最重要的是使用术语行为参数,这意味着保持类的状态(成员变量)。