【发布时间】: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