runnable对象中的此方法是否需要同步?

HIn*_*ace 5 java synchronized thread-safety

以下方法属于实现Runnable的对象A. 它通过来自对象A的其他方法和run方法中的代码异步调用(因此,它从其他线程调用,周期为5秒).

我最终可能会遇到文件创建异常吗?

如果我使方法同步...总是在对象A上获取锁?其中一个调用者在run()方法中的事实让我困惑:S

感谢您的投入.

private void saveMap(ConcurrentMap<String, String> map) {
    ObjectOutputStream obj = null;
    try {
        obj = new ObjectOutputStream(new FileOutputStream("map.txt"));
        obj.writeObject(map);

    } catch (IOException ex) {
        Logger.getLogger(MessagesFileManager.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        try {
            obj.close();
        } catch (IOException ex) {
            Logger.getLogger(MessagesFileManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    notifyActionListeners();
}
Run Code Online (Sandbox Code Playgroud)

Boh*_*ian 6

同步实例方法使用该this对象作为锁,并防止同时执行来自不同线程的所有同步实例方法(甚至其他方法).

要回答有关同步要求的问题,答案基本上是肯定的,因为您有多个线程访问相同的方法,因此输出可能会发生冲突.

作为设计注释,我会创建你的saveMap方法static,因为它不访问任何字段(它是无状态的),并且它更强烈地表明对文件的输出依赖于实例,因此更明显的是文件输出可能会发生冲突与其他情况.

编辑:

这是我建议的代码:

private static synchronized void saveMap(Map<String, String> map) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

仅供参考,static synchronized方法使用类对象(即MyClass.class)作为锁定对象,它是一个单例.