public class Main{
public static void main(String[] args) throws Exception {
// Creating objects for class Check(2 different objects)
Check c = new Check("s1");
Check c1 = new Check("s2");
c.start();c1.start();
}
}
class Check extends Thread{
Check(String name){super(name);}
private Integer ab = 2;
public void run(){
synchronized (ab) {
System.out.println(Thread.currentThread().getName());
for(int i=0;i<10;i++)System.out.print(i+" ");
}
}
}
Hier habe ich auf die Variable ab synchronisiert. Und ich habe auch zwei verschiedene Instanzen der Klassenüberprüfung erstellt, aber ich bekomme immer Ausgaben für s1 gefolgt von s2 oder umgekehrt, aber nicht gemischt, warum ist das so? wenn ich bereits zwei separate Objekte (in main) erstellt habe, also zwei verschiedene Threads, zwei verschiedene ab-Variablen, also wie es zu einer gemeinsamen Ressource für die zwei verschiedenen Objekte wird?Thread-Synchronisation auf Integer-Instanzvariable
B.T.W., Sie synchronisieren nicht auf der _variable_, Sie synchronisieren auf das Objekt, auf das sich die Variable bezieht. Es ist ein wichtiger Unterschied, weil einige Leute den Fehler gemacht haben, nicht zu erkennen, dass sich Variable zu verschiedenen Zeiten auf verschiedene Objekte beziehen kann, und einige haben den Fehler gemacht, nicht zu erkennen, dass dasselbe Objekt von mehr als einer Variablen referenziert werden kann. –
Dieser Code sieht eher wie ein Testcode als ein echter Fall aus, aber wenn Sie auf einem gesperrten, aber threadsicheren System synchronisieren möchten, [Number] (https://docs.oracle.com/javase/8/ docs/api/java/lang/Number.html) können Sie einen [AtomicInteger] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html) verwenden). –
@jameslarge: Ich verstehe, was du sagst. Ich war nicht genau darauf, weil mein Problem sich auf einen anderen Punkt konzentrierte. Wie auch immer, danke. :) – Santanu