gpt4 book ai didi

java - 同步代码块

转载 作者:行者123 更新时间:2023-11-30 06:11:17 24 4
gpt4 key购买 nike

我有一段 java 代码,如果不存在,它会在文件系统中创建一个目录。这个应用程序是多线程的(运行 2 个线程),所以有时会发生检查 if(!dir.exists()) 为两个线程返回 true,然后在内部代码中我调用 dir.mkdirs() 一个返回 true 创建目录,另一个返回 false,让我给你看代码:

public void makePath(){
File path = new File(Main.getPath());
synchronized (this) {
if (!path.exists()) {//return true on both treads
if (path.mkdirs()) {//return true only on one thread
logger.warn("Path was not existing, just created one");
} else {//returns false only on one thread
logger.warn("Problems while creating pth");
}
}
}
}

我的初始版本没有同步块(synchronized block),我认为这可以解决问题,但事实并非如此。当我使用单线程运行时,一切正常,对于单线程,!path.exists() 仅返回一次 true。

最佳答案

因为你在内部类中进行了同步。

synchronized (this) 

它不能是this,它可以是这个方法之外的一些其他对象,比如它可以是一个字段

您可以像这样更改代码:

synchronized (Foo.class) 

关于java - 同步代码块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34330561/

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