synchronized
методы работают на уровне экземпляра. Каждый экземпляр класса получает свою собственную блокировку.Блокировка получается каждый раз, когда вводится любой synchronized
метод экземпляра.Это позволяет нескольким потокам вызывать synchronized
методы в одном экземпляре (обратите внимание, что это также предотвращает вызов методов различных synchronized
в одном экземпляре).
Теперь, так как у вас есть два экземпляра вашего класса, каждый экземпляр получает свою собственную блокировку.Ничто не мешает двум потокам, каждый из которых работает одновременно со своим собственным экземпляром.
Если вы хотите предотвратить это, вы можете иметь блок synchronized(obj)
внутри run()
, где obj
будет некоторым объектомобщий для обоих экземпляров вашего класса:
class MyThread2 implements Runnable {
private static final Object lock = new Object();
...
public void run() {
synchronized(lock) {
...
}
}
}