为什么这个静态java方法不是线程安全的?

use*_*311 2 java static thread-safety

以下方法不访问任何共享变量.它仍然不是线程安全的.我要么测试错误,要么我错过了什么.请解释.

方法:

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;
}
Run Code Online (Sandbox Code Playgroud)

测试的线程类

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));
}
}
Run Code Online (Sandbox Code Playgroud)

以及启动线程的主要方法

public static void main(String[] args) throws Exception {
    for(int i = 1; i <= 100; i++) {
        (new AThread("Thread-->" + i)).start();
    }
}
Run Code Online (Sandbox Code Playgroud)

Sim*_*ser 6

该方法检查文件是否存在,然后创建它.这意味着一个线程可以在另一个线程正在执行时完成语句if (lockFile.exists())(结果: false) lockFile.createNewFile();(因此,它会创建锁定文件).

第一个线程现在基于不正确的信息继续:它认为该文件不存在但已由另一个线程创建.

线程安全不只是关于共享变量,而是关于共享资源(无论是变量,数据库,文件系统,网络连接等).