Блокировка, используемая методами synchronized
, связана с экземпляром класса MyThread
. Поскольку каждый поток имеет свой собственный экземпляр MyThread
, каждый поток синхронизируется с собственной блокировкой.
Если вы хотите синхронизировать все потоки, вы можете сделать что-то вроде:
public class MyThread extends Thread {
private static final Object sharedLock = new Object();
public void doSomething() {
synchronized(sharedLock) {
for(int i=0; i<100000; i++) {
System.out.println(this.i);
}
}
}
...
}
Альтернативой является synchronize
на MyThread.class
, но я предпочитаю первый подход.
В комментариях вы говорите, что если вы измените свой код, чтобы использовать synchronized(this)
в doSomething
, это неожиданно сработает. Я уверен, что это не так. Возможно, это сработало случайно, но не будет работать многократно и надежно.