是否已经避免了这两个java.io.File线程安全问题?

时间:2014-08-18 08:27:02

标签: java multithreading file filesystems thread-safety

假设Win32FileSystembeginMultiThreading在共享的MultiThreadingClass对象上同时运行多次,那么最有可能导致数据争用或其他线程问题的方法是什么?我知道这可能不是线程安全的,因为(1)setPath的参数被重用。我还看到(2)path不是java.io.File中的最终变量。但是,由于线程问题,我似乎无法找到此代码可能自行错误的部分。

public class MultiThreadingClass {
    private Holder h = new Holder();
    private String path ="c:\\somepath"; 
    public void beginMultiThreading(){
        h.setPath(new File(path));
        h.begin();
    }
}

public class Holder {
    private File path;
    public void setPath(File path){
        this.path = path;
    }
    public void begin(){
        System.out.println(path.getCanonicalPath()+"some string");
    }
}

2 个答案:

答案 0 :(得分:3)

正如@Duncan所说,代码目前是线程安全的。但是目前它还没有写任何文件。当您使用File对象时,我期望您将处理文件。一旦开始编写文件,还有其他注意事项:

  • 需要同步从多个线程写入单个文件。据我所知,这不是开箱即用的#34;功能。
  • 从同一个JVM中写入来自不同JVM或同一个不同类加载器的同一文件要困难得多。 (对于大多数Web框架,从多个Web应用程序写入日志文件是从不同类加载器写入单个文件的示例)。您将重新使用锁定文件或某种特定于平台的互斥锁。

警告:我必须这样做一段时间,所以在最新的Java并发包或其他人可以扩展的NIO包中可能会有更多的支持。

答案 1 :(得分:1)

您的示例代码根本没有多线程。所以我假设多个线程在他们自己的MultiThreadingClass实例上运行,或者他们在它们之间共享一个公共实例。

无论哪种方式,此代码都是线程安全的。唯一的共享状态是私有字符串对象,不会作为方法的一部分进行调整。