Ниже я выставил метод который внутри синхронизируется по классу Iron, который в данном случае есть внутренний класс в класс Solution. Метод run соответственно в Solution. И вот по итогу запуска кода ниже обе нити синхронизируются все равно, проверил, заходят поочередно. Здесь то я использую только вывод на экран, не обращаюсь к классу Iron нигде, при том что синхронизация идет по конкретному обьекту или классу. При двух разный обектах два потока спокойно работают внутри synchronized. Ладно когда обращаюсь к Iron, как в том что закомментировано ниже, а если просто вывод на экран, как оно видит и по какой логике блокирует? Вот кусок кода: public void run() { synchronized (Iron.class) { System.out.println(getName() + " inside run"); System.out.println(getName() + " inside run"); System.out.println(getName() + " inside run"); System.out.println(getName() + " inside run"); //Iron iron = takeIron(); //Clothes clothes = takeClothes(); //iron(iron, clothes); //returnIron(); } }