java - 使用同步列表

标签 java list synchronized

这是我第一次使用synchronized关键字,所以我仍然不确定它到底是如何工作的。我有一个列表,我想由多个线程访问,所以我这样做:

players = Collections.synchronizedList(new ArrayList<Player>(maxPlayers));

现在,我想确保我没有与 players.get() 同时调用 players.add(),所以我认为我应该使用同步语句(方法A和B可以同时调用):

public void A() {
    synchronized(players) {
        players.add(new Player());
    }
}

public void B(String msg) {
    synchronized(players) {
        for(int i = 0;i<players.size();i++) {
            players.get(i).out.println(msg);
        }
    }
}

这是正确的程序吗?如果没有,我该怎么办?

最佳答案

如果您仅通过synchronizedList返回的对象访问列表,那么访问应该是线程安全的,但请注意,您可能需要使用同步块(synchronized block)来执行复合操作,例如迭代列表或基于多个调用做出操作和决策进入列表(例如,获取一个值做出决定然后添加一个值)。

因此,在您的示例中,A() 不需要同步块(synchronized block),但如果您不希望列表在迭代期间被更改或被其他线程读取,则 B() 可能需要。 (事实上​​,通过使用计数器来迭代它需要防止循环终止条件和另一个线程删除项目之间的竞争条件;但其他迭代方式可能不会有这个问题)。

关于java - 使用同步列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3431501/

相关文章:

java - 如何使用队列组织多线程工作?

java - 设置标题背景 Vaadin 14 网格

java - 微服务-不同层中变量的定义。设计最佳实践

Python - 排序列表

python - 使用正则表达式从python列表中删除元素

java - JVM 同步 Finally block

运行 ant 时未找到 javadoc.exe

java - ZipEntry.getTime() 不可预测的结果

python - 如何将嵌套列表作为输入?

java - 了解同步的使用