假设Win32FileSystem
和beginMultiThreading
在共享的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");
}
}
答案 0 :(得分:3)
正如@Duncan所说,代码目前是线程安全的。但是目前它还没有写任何文件。当您使用File对象时,我期望您将处理文件。一旦开始编写文件,还有其他注意事项:
警告:我必须这样做一段时间,所以在最新的Java并发包或其他人可以扩展的NIO包中可能会有更多的支持。
答案 1 :(得分:1)
您的示例代码根本没有多线程。所以我假设多个线程在他们自己的MultiThreadingClass
实例上运行,或者他们在它们之间共享一个公共实例。
无论哪种方式,此代码都是线程安全的。唯一的共享状态是私有字符串对象,不会作为方法的一部分进行调整。