Java 多线程写文件问题

2018-04-17 14:02:44 +08:00
 zhangfeiwudi

最近刚学 java 需要实现一个多线程 往同一个文件里写入数据, 其实就是追加数据, 网上有人说多个线程处理数据放入队列,然后一个专门的线程处理队列数据写入。

后来我自己做了测试 发现 如果同一个文件 用追加方式写入 貌似不会出问题,不会说 a 线程写了一半 然后 b 线程又来写了。

不太懂 是不是 多线程追加写必须要单独开个线程写入 还是说 追加写入就可以了 系统层面就会保证不会出问题

3192 次点击
所在节点    问与答
8 条回复
goreliu
2018-04-17 14:13:50 +08:00
你在一个线程写文件时,是每次写入前都打开文件,写完关闭文件,还是最开始打开后就一直写?

如果是前者,先不说会不会出问题(小规模测试可能发现不了问题),效率就很低。如果是后者,会丢数据。
assiadamo
2018-04-17 14:19:28 +08:00
请使用 filechannel 的文件锁
goreliu
2018-04-17 14:23:26 +08:00
@assiadamo 这个能保证先后顺序吗,比如 a 线程在写文件,b 线程在等锁的过程中,c 线程也来等,那有没有可能 c 线程先抢到了锁?
TheCure
2018-04-17 14:36:51 +08:00
polythene
2018-04-17 15:35:16 +08:00
我记得在数据量不大的情况下,操作系统会保证每一次的写操作都是完整的,具体数值记不清楚了
honeycomb
2018-04-17 15:38:48 +08:00
@goreliu 要看锁的实现,filechannel 锁应该是不保证获取锁的顺序的
johnniang
2018-04-17 15:40:59 +08:00
多线程写有意义吗,放到一个队列体现不出多线程的威力吧
hillMonkey
2018-04-17 15:41:41 +08:00
这样是不是也可以?只用一个 Thread 写文件,写的内容从一个 LinkedBlockingQueue 中读取,其他 Threads 给这个 queue put 内容

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/447473

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX