Warum ist value
korrekt eingestellt, obwohl wir verschiedene Sperren in verschiedenen Threads verwenden?Warum ist der Wert korrekt eingestellt, obwohl wir verschiedene Sperren in verschiedenen Threads verwenden?
public class MyThread implements Runnable {
static String a = "LOCK";
static String b = "LOCK";
int id;
static int value = 0;
MyThread(int id) {
this.id = id;
}
@Override
public void run() {
if (id == 0) {
synchronized (a) {
for (int i = 0; i < Main.N; i++)
value = value + 3;
}
} else {
synchronized (b) {
for (int i = 0; i < Main.N; i++)
value = value + 3;
}
}
}
}
public class Main {
static final int N = 100000;
static int ITER = 100;
public static void main(String[] args) {
Thread threads[] = new Thread[2];
boolean sw = true;
for (int j = 0; j < ITER; j++) {
MyThread.value = 0;
for (int i = 0; i < 2; i++)
threads[i] = new Thread(new MyThread(i));
for (int i = 0; i < 2; i++)
threads[i].start();
for (int i = 0; i < 2; i++) {
try {
threads[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (MyThread.value != 2 * 3 * N) {
System.out.println("i was different than " + 2 * 3 * N + ", it is " + MyThread.value);
sw = false;
}
}
if (sw)
System.out.println("Something is strange");
}
}
Warum gehen Sie davon aus, dass sich ein Thread-Sicherheitsfehler garantiert zeigt? Praktisch die Definition von Thread-Sicherheits-Bugs ist, dass sie funktionieren können, bis sie nicht funktionieren. –
Ein * möglich * Grund ist, dass der erste Thread beendet wird, bevor der zweite überhaupt startet. –
@jack Sie benötigen den aufrufenden Code für den Kontext. Ohne sie könnte die Antwort lauten "weil die Threads nacheinander ablaufen". –