用于网络呼叫的双重锁定锁定

时间:2017-10-13 08:57:51

标签: java multithreading locking

在我的应用程序中,我有以下代码:

Folders[] folders = getFolders();
Folder folder = resolveFolder(folders,pattern);
if(folder == null){
    if(createFolderOn()){
        synchronized(lock){
            folders = getFolders(); //here I Am refreshing the folders array. This is needed because some other thread might have already created the folder.
            folder = resolveFolder(folders,pattern);
            if(folder == null){
                createFolder();
            }
        }
    }
 }       

getFolders()createFolder()确实是网络电话。当每个线程通过网络操作加载其数据时,执行这种双重检查锁定是否正确?我们的想法是不要多次创建与模式相对应的相同文件夹。提供程序保证文件夹在创建后立即返回,因此getFolders()createFolder()是同步调用。

修改 忘记提及我无法控制文件夹提供程序。它不限制文件夹创建(可以多次创建具有相同名称的文件夹)。由于我的要求禁止文件夹重复,我介绍了上述方法

1 个答案:

答案 0 :(得分:0)

我认为你应该考虑简化你的方法。喜欢:只需使createFolder()安全即可重复调用。

换句话说:真正的模块执行文件系统操作以创建文件夹 - 该模块应检查文件夹是否已存在。如果是这样,createFolder()什么也不做。如果文件夹不在那里 - 那么该模块可以使用自己的内部锁定来确保它只创建一次文件夹。请勿使用“网络”服务将此内部详细信息放入客户端。

鉴于OP对不拥有“网络”服务的评论:然后使用这些“服务”。而是创建自己的包装服务,该服务提供了以安全的方式分别检查创建文件夹的方法。

您的代码违反了单一责任规则:客户端代码执行两项操作 - 实际的“业务逻辑” - 但是担心锁定此“目录服务”。相反:创建自己的目录服务,负责锁定。