2017-10-13 34 views
0

在我的应用我有以下代码:双ckecked锁定网络电话

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()是同步调用。

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

回答

0

我认为你应该考虑简化你的方法。就像:只需让createFolder()安全地被重复调用。

换言之:确实执行文件系统操作来创建文件夹的模块 - 该模块应检查该文件夹是否已存在。如果是这样,createFolder()根本没有做任何事情。如果该文件夹不存在 - 那么该模块可以使用自己的内部锁定来确保它只创建一次文件夹。不要把这个内部细节放到使用你的“网络”服务的客户端上。

鉴于OP关于不拥有“网络”服务的评论:那么做而不是消耗这些“服务”。相反,创建自己的包装服务,提供检查和安全分别创建文件夹的方法。

您的代码违反了单一责任规则:客户端代码做了两件事 - 它的实际“业务逻辑” - 但它担心锁定此“目录服务”。相反:创建您自己的目录服务,注意锁定。

+0

我忘了提及我无法控制文件夹提供程序。它不限制文件夹创建(可以多次创建具有相同名称的文件夹)。由于我的要求禁止文件夹重复我引入了上述方法。无论如何,我同意如果可以实现,它应该是这样做的。 –

+0

你可能想用这些信息来提高你的问题。 – GhostCat

+0

@DeyanG。如果文件夹是按名称标识的,如何创建具有相同名称的多个文件夹?如果可以有多个“folderA”,如何知道在访问“folderA”时会得到哪一个?有些东西在这里没有意义。 –