2014-02-17 76 views
3

我看到new File("path")没有物理地在磁盘上创建文件。虽然在API中据说:File实例线程安全吗?

这个类的实例可以或可以不表示实际的文件系统 对象,如文件或目录。如果它确实表示这样一个对象,那么该对象驻留在一个分区中。分区是文件系统的特定于操作系统的存储部分。单个存储设备(例如物理磁盘驱动器,闪存,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来到这里,创建一个实例并开始执行操作。同时thread2中断它,使用相同的名称(myfile.zip)创建它的实例并执行一些其他操作。之后,他们因此保存该文件。

我需要确定它们不能使用同一个文件,最后一个保存文件的线程会覆盖前一个文件。

+0

你的问题很混乱 - 你想最后一个线程覆盖文件吗? – tddmonkey

+0

不是线程安全的。 –

+0

我只需要一个线程的更改才能应用。这意味着我不想拥有一个文件,其中前半部分由第一个线程创建,第二个半部分由第二个线程创建。 – Scadge

回答

2

不,文件不会保留锁定,并且对于您描述的模式不安全。你应该锁定或保留在一些包装类的文件。

如果你会提供更多的代码,有人可以帮助你找到合适的模式。

+0

或者我可以给文件唯一的名字,比如'File file = new File(“myfile-”+ uniqueId +“.zip”);',对吧? – Scadge

+0

是的,如果这是一个选项,它肯定是一个简单和安全的解决方案。 – Bex

+0

这就是我想听到的,谢谢! – Scadge

0

当然,你所评论的行不是线程安全的,你必须用互斥或监视器来保护它们。黄金法则是:每次你必须在多线程环境下编写某些东西时,有必要保护该区域以授予线程安全性(伯恩斯坦条件)。

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