如何同步文件写入以实现线程Java之间的最大并发性

时间:2013-11-01 18:43:20

标签: java file synchronization locking

我有10个文本文件,用于存储记录。在我的应用程序中,我有几个操作,例如写入文件和编辑文件(如果找到指定的行我创建一个临时文件并在那里传输所有信息,然后删除旧的并重命名临时文件)。

我的所有客户都可以访问10个文本文件,因此我希望同步他们的活动以保持数据的一致性。

如果客户端正在编辑或写入,我想锁定或同步文件,比如说f1.txt,所以没有其他人可以编写/编辑它,并允许其他客户端同时编辑f2.txt来增加并发性。 / p>

public void writeToFile(String pathname){
File f1 = new File(pathname)
synchronize (f1) {.. // do something}
}

我的问题是每次使用特定路径创建一个新文件。

请您为此提供任何指导和帮助。

由于

1 个答案:

答案 0 :(得分:3)

如果我理解正确,您希望在特定文件路径上进行同步(并且文件系统不会以您喜欢的方式强制执行此操作)。你是对的File对象不起作用。您需要同步的是文件的名称

public void writeToFile(String pathname){
File f1 = new File(pathname)
synchronize (f1.getCanonicalPath().intern()) {.. // do something}
}

getCanonicalPath方法将为引用相同路径的任何两个String对象返回相同的File值。例如,如果../logs/mylog.txt/var/spool/logs/mylog.txt是同一个文件,则它们将具有相同的规范路径。

intern方法为具有相同String的任意两个value对象返回相同的引用。因此,您最终锁定的是该文件的规范路径的单例实例。

我认为这符合您的需求。