V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zhangfeiwudi
V2EX  ›  问与答

Java 多线程写文件问题

  •  
  •   zhangfeiwudi · 2018-04-17 14:02:44 +08:00 · 3358 次点击
    这是一个创建于 2446 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    如果是前者,先不说会不会出问题(小规模测试可能发现不了问题),效率就很低。如果是后者,会丢数据。
    assiadamo
        2
    assiadamo  
       2018-04-17 14:19:28 +08:00
    请使用 filechannel 的文件锁
    goreliu
        3
    goreliu  
       2018-04-17 14:23:26 +08:00
    @assiadamo 这个能保证先后顺序吗,比如 a 线程在写文件,b 线程在等锁的过程中,c 线程也来等,那有没有可能 c 线程先抢到了锁?
    polythene
        5
    polythene  
       2018-04-17 15:35:16 +08:00
    我记得在数据量不大的情况下,操作系统会保证每一次的写操作都是完整的,具体数值记不清楚了
    honeycomb
        6
    honeycomb  
       2018-04-17 15:38:48 +08:00
    @goreliu 要看锁的实现,filechannel 锁应该是不保证获取锁的顺序的
    johnniang
        7
    johnniang  
       2018-04-17 15:40:59 +08:00 via Android
    多线程写有意义吗,放到一个队列体现不出多线程的威力吧
    hillMonkey
        8
    hillMonkey  
       2018-04-17 15:41:41 +08:00
    这样是不是也可以?只用一个 Thread 写文件,写的内容从一个 LinkedBlockingQueue 中读取,其他 Threads 给这个 queue put 内容
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2777 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:33 · PVG 19:33 · LAX 03:33 · JFK 06:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.