最近刚学 java 需要实现一个多线程 往同一个文件里写入数据, 其实就是追加数据, 网上有人说多个线程处理数据放入队列,然后一个专门的线程处理队列数据写入。
后来我自己做了测试 发现 如果同一个文件 用追加方式写入 貌似不会出问题,不会说 a 线程写了一半 然后 b 线程又来写了。
不太懂 是不是 多线程追加写必须要单独开个线程写入 还是说 追加写入就可以了 系统层面就会保证不会出问题
1
goreliu 2018-04-17 14:13:50 +08:00
你在一个线程写文件时,是每次写入前都打开文件,写完关闭文件,还是最开始打开后就一直写?
如果是前者,先不说会不会出问题(小规模测试可能发现不了问题),效率就很低。如果是后者,会丢数据。 |
2
assiadamo 2018-04-17 14:19:28 +08:00
请使用 filechannel 的文件锁
|
3
goreliu 2018-04-17 14:23:26 +08:00
@assiadamo 这个能保证先后顺序吗,比如 a 线程在写文件,b 线程在等锁的过程中,c 线程也来等,那有没有可能 c 线程先抢到了锁?
|
4
TheCure 2018-04-17 14:36:51 +08:00
|
5
polythene 2018-04-17 15:35:16 +08:00
我记得在数据量不大的情况下,操作系统会保证每一次的写操作都是完整的,具体数值记不清楚了
|
7
johnniang 2018-04-17 15:40:59 +08:00 via Android
多线程写有意义吗,放到一个队列体现不出多线程的威力吧
|
8
hillMonkey 2018-04-17 15:41:41 +08:00
这样是不是也可以?只用一个 Thread 写文件,写的内容从一个 LinkedBlockingQueue 中读取,其他 Threads 给这个 queue put 内容
|