gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:43:34 26 4
gpt4 key购买 nike

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

方法:

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));
}
}

启动线程的main方法

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

最佳答案

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

第一个线程现在根据不正确的信息继续:它认为该文件不存在,但它已被另一个线程创建。

线程安全不仅与共享变量有关,还与共享资源(变量、数据库、文件系统、网络连接等)有关。

关于java - 为什么这个静态java方法不是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10049737/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com