所以我有以下从多个线程访问的列表:
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);
}
最佳答案
如您所说,列表已经同步,因此您的removeString
方法也不需要同步
。
但是请注意,如果您的某个方法包含非原子操作(假设您要检查您的列表是否包含某些内容然后相应地修改列表),您可能需要添加另一层同步。
最后,你好像没有注意到这个方法:
public synchronized void removeString(String s)
在不同的锁上同步(它在 this
上同步)。回到我上面给出的例子,你会这样写:
public void someMethod() {
synchronized(listOfString) { //use the same lock!
if(listOfString.size() == 123) {
listOfString.add("lucky day");
}
}
}
关于java - 我是否需要同时同步方法和对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16611715/