Code:
import java.util.Random;
public class Mischen {
private int[] array = {0,1,2,3,4,5,6,7,8,9};
public synchronized void vertausche(int i, int j) {
int k = array[i];
array[i] = array[j];
array[j] = k;
}
private void ausgabe(){
System.out.print("[");
for(int i=0; i<9; i++) {
System.out.print(array[i] + ",");
}
System.out.println(array[9] + "]");
}
public static void main(String[] args) {
Mischen m = new Mischen ();
Mischer mischer1 = new Mischer(m);
Mischer mischer2 = new Mischer(m);
mischer1.start();
mischer2.start();
while(true) {
m.ausgabe();
}
}
}
class Mischer extends Thread {
Random random;
Mischen mischen;
public Mischer(Mischen m) {
random = new Random();
mischen = m;
}
public void run() {
while(true) {
int i = random.nextInt(10);
int j = random.nextInt(10);
vertausche(i,j);
}
}
private void vertausche(int i,int j) {
mischen.vertausche(i,j);
}
}
Wenn man diesen Code ausführt erhält man nach kürzester Zeit im Array doppelte einträge. Das liegt daran, dass der mischer1 und der mischer2 Thread nicht synchronisiert laufen.
Also während der Mischer1 Thread die Methode mischen ausführt wird die Methode nocheinmal von Mischer2 aufgerufen. Wenn der 1. Thread also die Zahlen 1 und 5 vertauschen will, dann macht er das ja so, dass er zunächst einmal die erste Stelle des Arrays auf die fünfte Stelle setzt und dann die fünfte auf die zwischengespeicherte 1. Stelle.
Okay, die beiden Threads kommen sich ins Gehege, eine Race condition liegt vor.
Wie kann ich die verhindern? einfach synchronized davor schreiben funktioniert nicht!
Und dann noch eine Frage:
Wenn ich den Mischer2 auskommentiere tritt das Problem immernoch auf! Warum das denn??
danke.