次のメソッドは、共有変数にはアクセスしません。それでもスレッドセーフではありません。私は間違ってテストしているか、何か不足しています。説明してください。この静的Javaメソッドはスレッドセーフではないのはなぜですか?
方法:
public static boolean acquireFolderLock(File directoryPath) {
final String LOCK_FILE_NAME = ".lock";
boolean isLocked = false;
if(directoryPath != null && directoryPath.isDirectory()) {
File lockFile = new File(new StringBuilder(directoryPath.getAbsolutePath()).append(File.separatorChar).append(LOCK_FILE_NAME).toString());
if(lockFile.exists()) {
isLocked = false;
} else {
try {
lockFile.createNewFile();
isLocked = true;
} catch(IOException ioex) {
isLocked = false;
}
}
}
return isLocked;
}
テスト
class AThread extends Thread {
String name;
public AThread(String name) {
this.name = name;
}
@Override
public void run() {
File f = new File("C:\\TEMP\\DIRECTORY");
System.out.println(name + ": " + Util.acquireFolderLock(f));
}
}
ためのThreadクラスとスレッド
public static void main(String[] args) throws Exception {
for(int i = 1; i <= 100; i++) {
(new AThread("Thread-->" + i)).start();
}
}
このメソッドがスレッドセーフではないとどのように判断していますか? –
メインメソッドとテストスレッドクラスを追加しました – user1318311
変数を共有していない可能性がありますが、状態を共有している可能性があります。 –