Vâng, không có bất kỳ chi tiết thực hiện, rất khó để biết, nhưng như trường hợp thử nghiệm của tôi cho thấy, tôi luôn nhận được 220 dòng đầu ra, tức là số dòng liên tục, với FileWriter
. Lưu ý rằng không có synchronized
nào được sử dụng tại đây.
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
/**
* Working example of synchonous, competitive writing to the same file.
* @author WesternGun
*
*/
public class ThreadCompete implements Runnable {
private FileWriter writer;
private int status;
private int counter;
private boolean stop;
private String name;
public ThreadCompete(String name) {
this.name = name;
status = 0;
stop = false;
// just open the file without appending, to clear content
try {
writer = new FileWriter(new File("test.txt"), true);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
for (int i=0; i<20; i++) {
new Thread(new ThreadCompete("Thread" + i)).start();
}
}
private int generateRandom(int range) {
return (int) (Math.random() * range);
}
@Override
public void run() {
while (!stop) {
try {
writer = new FileWriter(new File("test.txt"), true);
if (status == 0) {
writer.write(this.name + ": Begin: " + counter);
writer.write(System.lineSeparator());
status ++;
} else if (status == 1) {
writer.write(this.name + ": Now we have " + counter + " books!");
writer.write(System.lineSeparator());
counter++;
if (counter > 8) {
status = 2;
}
} else if (status == 2) {
writer.write(this.name + ": End. " + counter);
writer.write(System.lineSeparator());
stop = true;
}
writer.flush();
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Theo tôi được biết (và thử nghiệm), có hai giai đoạn trong quá trình này:
- tất cả các chủ đề trong hồ bơi tất cả tạo ra và bắt đầu, sẵn sàng để lấy các tập tin;
- một trong số họ lấy nó, và Tôi đoán nó sau đó khóa nội bộ nó, ngăn chặn các chủ đề khác để truy cập, bởi vì tôi không bao giờ nhìn thấy một dòng kết hợp nội dung đến từ hai chủ đề. Vì vậy, khi một thread được viết, những người khác đang chờ đợi cho đến khi nó hoàn thành dòng, và rất có thể, phát hành tập tin. Vì vậy, sẽ không có điều kiện chủng tộc nào xảy ra.
- nhanh nhất trong số những người khác lấy tệp và bắt đầu viết.
Vâng, nó giống như một đám đông chờ đợi bên ngoài phòng tắm, mà không cần xếp hàng .....
Vì vậy, nếu thực hiện của bạn là khác nhau, hiển thị mã và chúng tôi có thể giúp để phá vỡ nó xuống.
Vâng, điều này không rõ ràng về cách triển khai của bạn. Như trường hợp thử nghiệm đơn giản của tôi cho thấy, tôi nhận được dòng đầu ra liên tục với FileWriter với 20 luồng. Có thể cần phải thêm một số chi tiết triển khai. Xem câu trả lời của tôi. – FaithReaper