【问题标题】:multi thread write only one outputstream and data loss多线程只写一个输出流和数据丢失
【发布时间】:2020-01-21 11:45:31
【问题描述】:

我运行五个线程来生成随机字符串数据,然后只写入一个输出流。程序完成后,丢失了一些数据。

我简化了我的代码。

new Thread(() -> {
  stream.write(RANDOM_STRING + "\n)
).start();
class Stream {
  String buffer = "";

  Stream() {
    new Thread(() -> {
      BufferedOutputStream bs
       = new BufferedOutputStream(new FileOutputStream("PATH");
      bs.wrtie(buffer.getBytes());  // point 1
      buffer = ""                   // point 2
      bs.close();
    }).start();
  }
  public void write(String input) {
    buffer += input;
  }
}

我认为数据丢失的原因在第1点和第2点之间。我认为如果我使用索引数据结构来检查消耗了哪些数据,就可以解决。但是有没有更好的方法来解决这个问题?请帮我。谢谢。

【问题讨论】:

  • 制作十张卡片。在五个,你写buffer += RANDOM_STRING + "\n",在其他五个,写buffer = ""。洗牌。一个接一个地选择它们,并考​​虑程序的状态和按该顺序正确执行时的输出。再次洗牌。再看看当你按那个顺序执行它们时会发生什么。重复直到你明白为什么以这种方式使用共享变量是不好的,即使没有讨论 Java 内存模型的额外问题。每个线程都覆盖文件的事实也无济于事。

标签: java java-stream outputstream fileoutputstream bufferedwriter


【解决方案1】:

尝试将ConcurrentLinkedQueue<String> 用于buffer,在字符串引用上使用offerpoll 而不是+== ""

【讨论】:

    猜你喜欢
    • 2013-11-12
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 2013-12-17
    • 2013-03-19
    • 1970-01-01
    • 2015-10-26
    • 2017-03-08
    相关资源
    最近更新 更多