新建文件("...")会锁定文件吗?

3

我了解到new File("path")并不会在硬盘上创建一个文件。但是在API中写道:

该类的实例可以或者不可以表示实际的文件系统对象,比如文件或目录。如果它表示这样一个对象,则该对象驻留在分区中。分区是文件系统的操作系统特定存储部分。单个存储设备(例如物理磁盘驱动器、闪存、CD-ROM)可能包含多个分区。

那么我很好奇,在多线程环境下编写这样的代码是否安全:

File file = new File( "myfile.zip" );
// do some operations with file (fill it with content)
file.saveSomewhere(); // just to denote that I save it after several operations

例如,线程1来到这里,创建一个实例并开始进行操作。同时,线程2中断它,创建与其相同名称(myfile.zip)的实例并执行其他操作。之后它们按顺序保存文件。
我需要确保它们不使用同一个文件,并且最后一个保存文件的线程覆盖了之前的线程。

你的问题有点混淆 - 你想让最后一个线程覆盖文件吗? - tddmonkey
我只需要应用来自一个线程的更改。这意味着我不想有一个文件,其中前半部分由第一个线程创建,后半部分由第二个线程创建。 - Scadge
1
该文件是线程安全的,但您提到的文件操作不会使用File对象,因此它们不是线程安全的。 - Peter Lawrey
但他们会用什么呢? - Scadge
你想要做什么? - dcernahoschi
File实例本身是线程安全的,但这并不是你实际上要问的。 - user207421
2个回答

2

不,文件不会保持锁定状态,也不适用于您描述的模式。您应该将文件锁定或将其保存在某个包装类中。

如果您能提供更多代码,有人肯定可以帮助您找到合适的模式。


还是我可以给文件取一个唯一的名字,比如 File file = new File("myfile-" + uniqueId + ".zip");,对吧? - Scadge
是的,如果有这个选项,那肯定是一个简单而安全的解决方案。 - Bex

0

当然,你所评论的代码行不是线程安全的,你需要使用互斥锁或监视器来保护它们。黄金法则是:每当你在多线程环境下需要写入某个地方时,必须保护该区域以确保线程安全(Bernstein条件)。

我不确定你提出的语句是否也需要保护,因为我从未使用过该命令,但我认为这对其他人也可能有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接