java - 如何在不同的应用程序级别锁定文件?

标签 java multithreading file synchronization locking

场景如下:我有一个在 servlet 容器内运行的多线程 Java Web 应用程序。 该应用程序在 servlet 容器内多次部署。有多个servlet容器 在不同的服务器上运行。

也许这张图说明了这一点:

server1
+- servlet container
   +- application1
   |  +- thread1
   |  +- thread2
   +- application2
      +- thread1
      +- thread2
server2
+- servlet container
   +- application1
   |  +- thread1
   |  +- thread2
   +- application2
      +- thread1
      +- thread2

网络共享目录中有一个所有线程都可以访问的文件。他们确实经常访问该文件。 大多数情况下,文件仅由这些线程读取。但有时它是写的。

我需要一个故障安全解决方案来同步所有这些线程,以保证数据的一致性。


无法(正常)工作的解决方案:

  1. 使用 java.nio.channels.FileLock
    我能够使用 FileLock 类同步来自不同服务器的线程。但这不适用于线程 在同一个进程(servlet 容器)中,因为文件锁在进程范围内可用。

  2. 使用单独的文件进行同步
    我可以创建一个单独的文件,指示进程正在读取或写入文件。这个解决方案 适用于所有线程,但有几个缺点:

    • 表现。创建、删除和检查文件是相当缓慢的操作。一个同步文件的低权重实现将阻止并行读取文件。
    • 同步文件将在 JVM 崩溃后保留,因此需要手动清理。
    • 我们在删除网络文件系统上的文件时遇到了奇怪的问题。
  3. 使用消息传递
    我们可以实现一个消息系统,线程将使用该系统来协调文件访问。但这对于这个问题来说似乎太复杂了。再说一次:性能会很差。

有什么想法吗?

最佳答案

除了明显的解决方案之外,您已经列举了可能的解决方案:删除对该文件的依赖

除了从文件中读取数据之外,还有其他方法可以让线程获取该数据吗?如何设置某种进程来负责协调对该信息的访问,而不是让所有线程都读取文件。

关于java - 如何在不同的应用程序级别锁定文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/484182/

相关文章:

android - 多传感器Android日志记录

android - 如何防止 Android 应用程序因后台线程中的 IOException 而崩溃?

java - 如果我在实例方法中放置静态锁会发生什么?

c - fwrite 文件输出错误

c - 重定向后如何返回标准输出?

java - 无法在java中找到while循环行为

java - 如何使用日历和时区

java - spring-retry Retryble 注释与 retryTemplate

java - 从单词列表中查找字符串,其中包含字符串中的某些字符

仅当这两个文件存在于 C 中时才继续程序