2014-02-17 64 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

當然,你所評論的行不是線程安全的,你必須用互斥或監視器來保護它們。黃金法則是:每次你必須在多線程環境下編寫某些東西時,有必要保護該區域以授予線程安全性(伯恩斯坦條件)。

我不確定您提出的聲明是否需要保護,因爲我從未使用該命令,但我認爲這可能對其他人也有幫助。