【问题标题】:Does new File("...") lock the file?new File("...") 是否锁定文件?
【发布时间】:2014-03-16 16:50:10
【问题描述】:

我读到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

例如,thread1 来到这里,创建一个实例并开始执行操作。同时 thread2 中断它,创建它的实例 同名 (myfile.zip) 并执行一些其他操作。之后他们会保存文件。

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

【问题讨论】:

  • 您的问题令人困惑-您是否希望最后一个线程覆盖文件?
  • 我只需要应用一个线程的更改。这意味着我不想有一个文件,其中前半部分由第一个线程创建,后半部分由第二个线程创建。
  • 文件是线程安全的,但你提到的文件操作不会使用File对象,它们也不是线程安全的。
  • 但是他们会用什么?
  • 你想做什么?

标签: java multithreading java-io


【解决方案1】:

不,文件不保留锁,并且对于您描述的模式不安全。您应该将文件锁定或保存在某个包装类中。

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

【讨论】:

  • 或者我可以给文件命名,比如File file = new File("myfile-" + uniqueId + ".zip");,对吧?
  • 是的,如果这是一个选项,那肯定是一个简单而安全的解决方案。
【解决方案2】:

当然,您评论的行不是线程安全的,您必须使用互斥锁或监视器保护它们。黄金法则是:每次您必须在多线程上下文中写入内容时,都必须保护该区域以授予线程安全性(伯恩斯坦条件)。

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

【讨论】:

    猜你喜欢
    • 2011-06-14
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 2019-07-10
    相关资源
    最近更新 更多