使用同步列表

时间:2010-08-07 18:13:45

标签: java list synchronized

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

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

现在,我想确保我没有在players.add()的同时调用players.get(),所以我认为我应该使用synchronized语句(方法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);
        }
    }
}

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

1 个答案:

答案 0 :(得分:2)

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

因此,在您的示例中,A()不需要synchronized块,但如果您不希望在迭代期间更改列表或由其他某些线程读取,则B()可能不需要。 (实际上,通过使用计数器进行迭代,需要 来防止循环终止条件和另一个删除项目的线程之间的竞争条件;其他迭代方法可能没有这个问题。“ / p>