Zgodnie z moim rozumowaniem poniższy fragment kodu powinien skutkować zakleszczeniem. Powód jest taki, że gdy wątek t1 blokuje statyczny obiekt firstData, uzyskał blokadę klasy. Tak więc, gdy próbuje zablokować kolejny statyczny obiekt secondData, żądanie powinno zostać zablokowane.Blokowanie statycznych elementów klasy
Jednak program działa poprawnie i drukuje *** Successfully acquired both the locks
co chodzi o blokowanie obiektów statycznych, że im brakuje tutaj?
public class Deadlock {
public static void main(String[] args) {
Thread t1 = new Thread(new DeadlockRunnable());
t1.start();
}
}
class DeadlockRunnable implements Runnable {
static Object firstData = new Object();
static Object secondData = new Object();
public void run() {
synchronized(firstData) {
synchronized(secondData) {
System.out.println("*** Successfully acquired both the locks");
}
}
}
}
Dla wszystkich tych, którzy odpowiedzieli, że zamki są na obiekcie, zamiast klasy, proszę spojrzeć na this
Ponadto pojedynczy wątek nigdy nie spowoduje zakleszczenia. –
Poniższy link w to uwierzył: http://stackoverflow.com/questions/437620/java-synchronized-methods-lock-on-object-or-class –
Zgadzam się z @KirkWoll. Ale mam pytanie. Czy to oznacza, że jeden wątek może jednocześnie blokować wiele obiektów statycznych? – noMAD