在java中使用锁

时间:2011-05-20 07:21:15

标签: java locking

你好 我正在构建一个小的p2p程序,所以我想在下载文件时使其无法删除。简单的解决方案是使用锁,但我再次希望它可以让多个客户端下载文件(这意味着许多线程可以同时访问下载方法)。 我希望情况很清楚。 有关如何实施它的任何想法? 谢谢!

4 个答案:

答案 0 :(得分:1)

利用java.util.concurrent.locks.ReentrantReadWriteLock。使用java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock来下载文件的线程和java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock用于在下载时应该访问它的其他线程。

答案 1 :(得分:0)

http://download.java.net/jdk7/docs/api/java/util/concurrent/locks/package-frame.html有一堆锁实现,如果所有可能的删除器都在同一个VM中,那么这应该会有所帮助,但是在java核心库中没有flock等效。

答案 2 :(得分:0)

当删除来自系统调用时,你无法处理这种情况,遗憾的是在java中这是不可能的

所以要么你应付这个并且你通过一个简单的FileLockManager或其他什么来保护你的'delete'方法,或者鉴于文件的大小很小,你可以将它复制到另一个目录(每个客户端/组的一个临时文件)例如客户端)然后用户可以用原始文件做任何他想做的事情

只是我的2美分

答案 3 :(得分:0)

我有针对此问题的程序化解决方案

  1. 为每个文件保留堆栈数据结构。保持同步。
  2. 每当调用一个线程来下载文件时,它都会在堆栈中推送一个元素,当它完成时会弹出元素。
  3. 现在有一个特定文件的删除请求,它将始终检查堆栈大小,并且仅当堆栈大小为零时才成功。
  4. 此方法存在问题:如果某个线程由于某种原因而崩溃,则堆栈将始终具有一个条目,该文件永远不会被删除。