синхронизированный (A.this) будет полагаться на ваш экземпляр A.
В вашем случае этот экземпляр может отличаться, т. Е. Поток, выполняющий B.main (), и другой поток, выполняющий C.main (), создадут другой экземпляр A. Следовательно, один из них сможет получить доступ к public void task()
, даже если к нему уже обращается другой.
Если вы хотите убедиться, что один поток за раз может получить доступ к этому методу задачи, вы можете сделать это следующим образом:
class A{
private static final Object myLock = new Object ();
public void task() {
synchronized(myLock) {
//method stuff
}
}
}
Вы также можете взглянуть на Замки .