gpt4 book ai didi

java - 尝试在java中同步文件写入系统

转载 作者:搜寻专家 更新时间:2023-10-31 19:56:02 24 4
gpt4 key购买 nike

我正在尝试从数据库中同步一个文件在硬盘上的兑现。

我正在做什么检查文件是否存在,如果不存在,我从数据库中获取文件并部署它。由于竞争条件,我不想多次写入文件。

这是我编写的代码:

重要:此代码在具有所有含义的 Bean 中

@Override
public String getThumbnailPictureUrl(Design design) {
String relativePath = String.format(THUMBNAIL_URL, design.getId(), design.getThumbnailPicture().getFileName());
String realPath = servletContext.getRealPath("/"+relativePath);
logger.info("Request Thumbnail picture for design: " + design.getId());
logger.info("Thumbnail picture relative path: " + relativePath);
logger.info("Thumbnail picture real path: " + realPath);
File file = new File(realPath);
if(!file.exists())
{
synchronized (thumbnailLock)
{
if(!file.exists())
{
logger.warn("Could not fild file in path: " + realPath);
FileAttachment pictureAttachment = design.getThumbnailPicture();
Hibernate.initialize(pictureAttachment.getAttachment());
Data data = (Data) pictureAttachment.getAttachment();
file = toolBox.convertBlobToFile(data.getBlob(), file);
logger.warn("file created in path: " + realPath);
}
}
}
return relativePath;
}

使用此解决方案以防万一我找不到文件我真的不会像任何其他文件一样写入文件 2 次因为我正在为所有试图访问它的线程同步整个 block 即使是写一个不同的文件。

有什么建议吗?

谢谢。

最佳答案

类似于@Avi 的解决方案,但使用了 ConcurrentHashMap。

private final ConcurrentMap<String, Object> map = new ConcurrentHashMap<>();

String name = file.getName();
Object lock = map.get(name);
if (lock == null) {
map.putIfAbsent(name, new Object());
lock = map.get(name);
}

synchronized (lock) {
// do something
}

map.remove(name);

关于java - 尝试在java中同步文件写入系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17559828/

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