Ниже я выставил метод который внутри синхронизируется по классу 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();
}
}
И. Ж.
41 уровень
У меня вопрос более теоретический, не складывается логика. Обнаружил момент.
Решен
Комментарии (7)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Вадим
14 июля 2022, 19:12решение
Представьте, что блок synchronized - туалет. Iron.class - дверь этого туалета. Дверью может быть любой объект. В Вашем случае это специальный объект (литерал), который представляет собой общее описание класса Iron.
У любого объекта (как и у Iron.class) внутри есть мьютекс (читай - табличка), который принимают одно из двух значений: свободно или занято.
Когда какой-то поток входит в туалет, табличка на двери (мьютекс у объекта) принимает значение "Занято" и никто больше туда не войдет.
То есть все равно что поток делает внутри. Он может просто висеть в режиме сна, но табличка на двери будет "Занято".
Еще раз, даже в Вашем примере: можно создать абсолютно любой объект и использовать его исключительно в качестве двери с табличкой - при этом ничего не измениться в плане поведения потоков в Вашем блоке.
+2
Вадим
14 июля 2022, 19:21решение
Ну а когда разные двери, то есть Вы сами писали:
то это разные туалеты типового проекта с разными дверями.
+2
И. Ж.
15 июля 2022, 10:29
Благодарю за ответ! В целом понял, но правда все равно смущает, именно если потоки на двух разных обьектах заходят и они распознают на входе сразу, при том что работа по обьекту видна уже внутри синхронизированного блока, я могу обратиться к нему там, могу нет и при том что в потоке самом я нигде изначально не указываю что буду работать именно с этим обьектом, но при разных обьектах внутри оно зайдет, а если к одному обьекту обращусь то нет. Наверное особый механизм там и так не обьяснить, хотя как бы и понятно, по принципу таблички, занято или нет, конкретного обьекта.
0
Стас ПасинковSoftware Developer в ZipyMaster
14 июля 2022, 18:45решение
клас Iron спільний для всіх тредів. тобто один на всі.
оскільки ви синхронізувалися по ньому, то як тільки один тред захопив лок на цьому класі - всі інші треди чекають поки цей клас не "звільниться".
як тільки він звільнився першим тредом - його лочить якийсь інший тред, і всі інші треди чекають знов поки з'явиться можливість залочити його знов (коли він звільниться, звісно).
тому да, виходить, шо всі треди входять у цей блок по черзі
+2
И. Ж.
15 июля 2022, 10:36
Благодарю за ответ! Но примерно так понял, написал бы любой обьект любого класса с окончанием class и оно одинаково будет блокировать независимо использую внутри я эти классы или их обьекты или нет.
0
Стас ПасинковSoftware Developer в ZipyMaster
15 июля 2022, 10:52решение
отеє закінчення .class - то не просто якась зручна штука.
то отримання об'єкту, який описує сам цей клас у джаві. тобто в цьому об'єкті, який ви отримаєте буде список методів, список змінних того класу, їх модифікатори доступу, і всього такого.
тобто це буде не об'єкт праски, а об'єкт самого класу, як його бачить джава.
оскільки клас праски у вас один на всю програму - то і об'єкт цей буде однаковий на всю програму, з якого б місця програми ви не зробили Iron.class, з якого б треду ви це не зробили б.
а отже, оскільки ви синхронізувалися по одному і тому ж об'єктові - то і виходить, шо всі треди заходили в той синхронізований блок по-черзі. бо поки один тред не закінчить (не вийде із блоку синхронізації і не звільнить той об'єкт) - то інші треди і не могли зайти туди, а тому стояли і чекали
+2
И. Ж.
15 июля 2022, 11:57
Понял! Похоже именно этого момента не понимал, спасибо!
0