在我的应用程序中,我有以下代码:
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 :(得分:0)
我认为你应该考虑简化你的方法。喜欢:只需使createFolder()
安全即可重复调用。
换句话说:真正的模块执行文件系统操作以创建文件夹 - 该模块应检查文件夹是否已存在。如果是这样,createFolder()
什么也不做。如果文件夹不在那里 - 那么该模块可以使用自己的内部锁定来确保它只创建一次文件夹。请勿使用“网络”服务将此内部详细信息放入客户端。
鉴于OP对不拥有“网络”服务的评论:然后不使用这些“服务”。而是创建自己的包装服务,该服务提供了以安全的方式分别检查创建文件夹的方法。
您的代码违反了单一责任规则:客户端代码执行两项操作 - 实际的“业务逻辑” - 但是还担心锁定此“目录服务”。相反:创建自己的目录服务,负责锁定。