java - 在 JVM 内部和跨 JVM 同步共享文件写入

标签 java concurrency nio file-locking

我有 2 个不同的 tomcat7 服务器,每个服务器上都部署了相同的 Web 服务。每个 Web 服务请求都必须更新共享文件系统(通常是 NAS)上的文件。 文件写入必须同步,以避免 Tomcat 服务器的 JVM 内部以及两台服务器的 JVM 之间发生冲突。 我尝试了几种方法:

=> 用于文件写入的同步块(synchronized block)只能在同一个 JVM 中工作。

=> FileLock 适用于每个 JVM,但不适用于服务器的 JVM(一个文件只能锁定一次)。

那么使用 Java7 nio 文件系统怎么样?这可以帮助我吗? 解决这个问题的最佳方法是什么?

PS:抱歉,如果我的英语不好......

最佳答案

我可以想到两种方法:

  1. 使用synchronized(或Lock)以及FileLock;即首先获取表示规范化绝对路径名的唯一对象的本地锁,然后获取 FileLock

  2. 使用数据库;例如锁定数据库表中的一行,该行将规范化绝对路径名作为唯一键。

<小时/>

And how about using the Java7 nio file system ? can this help me ?

没有。问题在于文件锁定是操作系统功能,而行为(不对同一进程中的其他线程进行锁定)是基本文件锁定语义......跨越一系列不同的操作系统。

关于java - 在 JVM 内部和跨 JVM 同步共享文件写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31318075/

相关文章:

java - Nio Selector.select IO 准备情况

java - 使用NIO解码器会导致读取整个文件吗?

java - 使用 Java 泛型寻找模式和 API 设计

java - Java 中的重入是如何实现的?

java.lang.ClassCastException : android. os.BinderProxy 无法转换为 com.leonard.sg.okcoin.service.SyncAndTradeService$SyncAndTradeBinder

c# - ConcurrentBag 字符串并在 Parallel.ForEach 中使用 .Contains

java - 在 Java 中,多少个 Future 才算太多?

java - NIO选择器OP_READ和OP_WRITE,关于处理它们的一些问题

java - BigDecimal 在 Velocity、Struts2 中计算为字符串

java - 为什么 JavaFX 中的 Transform 看起来像 3D?