Bueno, sin ningún detalle de implementación, es difícil saber, pero como mi caso de prueba muestra, siempre me 220 líneas de salida, es decir, número constante de líneas, con FileWriter
. Observe que no se usa synchronized
aquí.
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();
}
}
}
}
como lo entiendo (y prueba), hay dos fases en este proceso:
- todos los hilos en la piscina todo crea y se inicia, listo para agarrar el archivo;
- uno de ellos lo agarra, y supongo que internamente lo bloquea, impide que otros subprocesos tengan acceso, porque nunca veo una línea combinada de contenidos que provienen de dos hilos. Entonces, cuando un hilo está escribiendo, otros están esperando hasta que complete la línea, y muy probablemente, libere el archivo. Entonces, no habrá condiciones de carrera.
- el más rápido de los demás toma el archivo y comienza a escribir.
Bueno, es igual que una multitud que esperaba fuera de un cuarto de baño, sin hacer cola .....
tanto, si su aplicación es diferente, muestran el código y nos puede ayudar a romper hacia abajo.
Bueno, esto no está muy claro cómo es su implementación. Como muestra mi caso de prueba simple, obtengo líneas constantes de salida con FileWriter con 20 hilos. Puede ser necesario agregar algunos detalles de implementación. Ver mi respuesta – FaithReaper