尝试用java同步文件写入系统

尝试用java同步文件写入系统,java,concurrency,Java,Concurrency,我正在尝试从数据库同步硬盘上的文件兑现 我在检查文件是否存在时所做的工作,如果不存在,则从数据库中获取文件并部署它。由于竞争条件,我不想多次写入该文件 以下是我编写的代码: IMPORTENT:此代码包含在一个Bean中,具有其所有含义 有了这个解决方案,如果我找不到文件,我真的不会像其他任何文件那样写两次文件,因为我正在同步所有线程试图到达它的整个块,即使是写一个不同的文件 有什么建议吗 谢谢。创建锁的HashMap怎么样?密钥将是文件路径,值将只是用作锁的对象。假设该地图的定义如下: Map

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

我在检查文件是否存在时所做的工作,如果不存在,则从数据库中获取文件并部署它。由于竞争条件,我不想多次写入该文件

以下是我编写的代码:

IMPORTENT:此代码包含在一个Bean中,具有其所有含义

有了这个解决方案,如果我找不到文件,我真的不会像其他任何文件那样写两次文件,因为我正在同步所有线程试图到达它的整个块,即使是写一个不同的文件

有什么建议吗


谢谢。

创建锁的
HashMap
怎么样?密钥将是文件路径,值将只是用作锁的对象。假设该地图的定义如下:

Map<String, Object> locks = new Map<String, Object>();

类似于@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); 
private final ConcurrentMap=new ConcurrentHashMap();
字符串名称=file.getName();
对象锁=map.get(名称);
if(lock==null){
map.putIfAbsent(name,new Object());
lock=map.get(name);
}
已同步(锁定){
//做点什么
}
删除(名称);

文件路径是动态的。我无法动态创建密钥/对象并将其锁定。。。它具有相同的竞争条件势。当我锁定这个对象时,下面的线程已经用一个新的线程替换了它。看看我的代码,我认为它解决了所有竞争条件。至少是我能想到的。还有一些在等所有的文件。但原始关键部分是按文件锁定的。
表操作成本不高(在时间处理中)
map.remove(锁)不是按你想的做,在这种情况下,什么都不做。我想你的意思是
map.remove(file.getName())为什么不使用
ConcurrentHashMap
,至少是什么版本的Java?每次查询文件存在时,您的解决方案都会创建新对象,因此并不总是比@Avi的解决方案好。
if(!file.exists()) 
{
    Object lock = null;
    synchronized (locks) {
       lock = locks.get(file.getName());
       if(lock == null) {
            lock = new Object();
            locks.put(file.getName(), lock);

       }
    }
    synchronized (lock) 
    {
        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);
        }
    }
    synchronized(locks) { 
         map.remove(lock)); 
    }
}
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);