2011-05-20 10 views
0

您好 我正在構建一個小小的p2p程序,所以我想讓一個文件在下載時無法被刪除。簡單的解決方案是使用鎖,但是我希望它可以讓多個客戶端下載該文件(這意味着許多線程可以同時訪問下載方法)。 我希望事態明朗。 如何實現它的任何想法? 謝謝!在java中使用鎖

回答

1

使用java.util.concurrent.locks.ReentrantReadWriteLock。使用java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock作爲正在下載文件的線程,java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock作爲應該在下載時訪問它的其他線程。

+0

但我看到使用這個鎖只有一個線程獲得鎖的訪問權限,我怎樣才能使其訪問許多線程? – yotamoo 2011-05-20 07:49:40

+0

訣竅是暫停下載的時間間隔,短時間釋放writelock。這使所有等待的讀鎖能夠並行訪問迄今爲止下載的數據。然後重新獲取寫鎖並繼續下載。重要的是,所有讀寫鎖都是從同一個ReadWriteLock實例中獲取的。 – Sylar 2011-05-20 09:37:50

+0

ReadLock不會彼此阻塞,它們可以同時訪問鎖定的區域(如果沒有WriteLock活動) – Sylar 2011-05-20 10:07:00

0

當刪除來自系統調用你不能處理的情況下,也因此,無論你與應對是一個Java

不幸的是不可能的,你通過簡單的FileLockManager或任何守護你的「刪除」的方法,或者考慮到文件的大小很小,可以將其複製到另一個目錄(例如,每個客戶端/客戶端組1的臨時文件),然後用戶可以對原始文件執行任何他想要的操作

只是我的2美分

0

我對這個問題

  1. 一個編程溶液保持一個堆棧數據結構爲每個文件。保持同步。
  2. 每當一個線程被調用來下載一個文件時,它將會壓入堆棧中的一個元素,當它完成時它會彈出該元素。
  3. 現在,對於某個特定文件的刪除請求來了,它總是會檢查堆棧大小,並且只有堆棧大小爲零時纔會成功。

這種方法的問題:如果線程因某種原因或其他原因崩潰,堆棧將始終有一個條目,該文件將永遠不會被刪除。