我是否需要同步方法和对象

时间:2013-05-17 14:37:06

标签: java synchronization

所以我有以下列表,可以从多个线程访问:

ArrayList<String> listOfString = Collections.synchronizedList(new ArrayList<String>());

我知道当我遍历列表时,我必须像这样同步:

synchronized(listOfString)
{
    for(String s : listOfString) System.out.println(s);

    listOfString.clear();
}

如果我想删除某些内容,请执行此操作:

public void removeString(String s)
{
    listOfString.remove(s);
}

或者这个:

public synchronized void removeString(String s)
{
    listOfString.remove(s);
}

1 个答案:

答案 0 :(得分:7)

正如您所说,该列表已经同步,因此您的removeString方法也不需要synchronized

但请注意,如果您的某个方法包含非原子操作(假设您要检查列表是否包含某些内容,请相应地修改列表),则可能需要添加另一层同步。

最后,您似乎没有注意到这种方法:

public synchronized void removeString(String s)

在不同的锁上同步(它在this上同步)。回到我上面给出的例子,你会写出来:

public void someMethod() {
    synchronized(listOfString) { //use the same lock!
        if(listOfString.size() == 123) {
            listOfString.add("lucky day");
        }
    }
}