这是场景:我有一个在servlet容器中运行的多线程java Web应用程序.应用程序在servlet容器中多次部署.有多个servlet容器在不同的服务器上运行.
也许这个图表清楚地说明了:
server1
+- servlet container
+- application1
| +- thread1
| +- thread2
+- application2
+- thread1
+- thread2
server2
+- servlet container
+- application1
| +- thread1
| +- thread2
+- application2
+- thread1
+- thread2
Run Code Online (Sandbox Code Playgroud)
网络共享目录中有一个文件,所有这些线程都可以访问.他们经常访问该文件.大多数情况下,文件只能由这些线程读取.但有时它是写的.
无效的解决方案(正确):
使用java.nio.channels.FileLock
我能够使用FileLock类同步来自不同服务器的线程.但是这对于同一进程(servlet容器)中的线程不起作用,因为文件锁在进程范围内可用.
使用单独的文件进行同步,
我可以创建一个单独的文件,指示进程正在读取或写入文件.此解决方案适用于所有线程,但有几个缺点:
使用消息传递
我们可以实现一个消息传递系统,线程将使用它来协调文件访问.但这对于这个问题来说似乎太复杂了.再说一次:表现会很糟糕.
有什么想法吗?
事情就是这样:我有两个应用程序,用C++编写并在两台具有不同操作系统的机器上运行(一个Linux和一个Windows).其中一个过程负责更新NAS(网络附加存储)上的XML文件,而另一个过程则读取此文件.
是否可以同步这两个进程,以避免在修改文件的同时读取文件?