多个java程序写一个文件,如何保证只有一个程序在写这个文件呢?

以前做的是多线程加锁 其实只要加个 synchronized 就好了,但是如果是多个 不同的java程序 怎么保证只有一个进程在写入呢

用文件锁可行吗?

 FileChannel fc = fi.getChannel(); 
    return fc.tryLock(); 

如果放任不管,多个进程 同时写一个文件 会出问题吗?

阅读 3.6k
3 个回答
以前做的是多线程加锁 其实只要加个 synchronized 就好了,但是如果是多个 不同的java程序 怎么保证只有一个进程在写入呢

多个不同的应用加锁的话就得需要一个公共的中间件来控制这个锁,比如 Redis、Zookeeper、数据库。

只要能达到排他性都是可以的,文件也是类似;只要能排他就可以。

这里有一个基于 Redis 的分布式锁,可以了解下;思路都差不多。

https://github.com/crossoverJ...

https://crossoverjie.top/tags...

不管是多个进程写同一个文件,还是多个线程写同一个快内存,都属于共享资源的竞争问题,如果放任不管,操作系统会把你所有的内容写到硬盘上而不报任何错,但是这样会造成程序结果的不确定性,或者说不可预测程序的结果,进而导致其他问题,所以有一系列的同步方案来避免这种不确定性,比如说信号量,锁等等。如果你能容忍这种不确定性,那你尽管放任不管。

另外,java提供了文件加锁机制,多个jvm进程照样可行,调用FileChannel类的lock和tryLock方法,第一个调用会阻塞直至可获得锁,而第二个调用将立即返回,要么返回锁,要么在锁不可获得的情况下返回null。这个文件将保持锁定状态,直至通道关闭,或者在锁上调用了release方法。

这两个方法还可以在文件的某一个区域上加锁,具体看API。

linux中好像没有文件锁的概念, 在windows有文件锁。 个人觉得,修改文件这种需求在小些的项目中可以通过后台代码和页面提示来控制修改的人数。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题