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

标签 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);
}

最佳答案

如您所说,列表已经同步,因此您的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/

相关文章:

java - glassfish 中的特殊字符不起作用

java - Android:从随机 fragment/Activity 访问用户登录数据

java - 如何在 Spring Boot 中单独修改 channel 内每个接收者的每个代理消息?

c++ - 线程和简单的死锁修复

java - 是否有强大的 java.util.logging 系统日志处理程序实现?

java - JNA 是否允许通过引用或值将二维数组传递给 C?

JavaScript 同步选项

algorithm - 是否有任何同步算法/引用可用于同步目录?

android - 为 android/ios 构建同步服务?

c++ - 使用 sleep() 时生产者消费者(使用 Monitor)代码不工作?