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