Замок синхронизации

166
31 октября 2021, 01:10

Есть два примера сихронизированного кода. В первом блокировка не работает, во втором работает. Почему я догадываюсь, но хотелось бы услышать детальное разьяснение. Спасибо!

//example #1
synchronized (new Object()) {
//...
}
//example #2
synchronized (Object.class) {
//...
}
Answer 1
synchronized (new Object()) {

Каждое исполнение этого кода запирает блок внутри {...} на новом объекте. Так что друг другу эти исполнения не препятствуют. В то же время, описание типа Object существует в одном экземпляре, поэтому

synchronized (Object.class) {

не дает другим потокам войти в блок {...}.

Answer 2

Суть в том, что когда объявляешь синхронизированный блок кода ты должен передать ему объект на котором будет установлена блокировка. Это означает что когда поток попытается исполнить этот синхронизированный блок ему необходимо будет установить блокировку на переданный тобой объект и если другой поток уже установил на него блокировку, то он грубо говоря встанет в очередь на этот объект.

//example #1
synchronized (new Object()) {
//...
}

Вот это работать не будет по той причине, что каждый раз когда поток будет пытаться получить объект на котором ему необходимо установить блокировку будет создаваться новый объект, на котором разумеется не будет никаких блокировок да и вообще он свободен как ветер.

//example #2
synchronized (Object.class) {
//...
}

Будет работать по той причине, что объект получаемый таким образом единственен для всей программы, такой вшитый синглтон, потому что объекты представляющие из себя "описания классов" единственны (почти всегда). По этой причине описанной выше ситуации не возникнет, каждый раз когда поток будет пытаться выполнить этот синхронизированный блок он будет получать тот же объект что и все остальные потоки и корректно вставать в "очередь" если объект заблокирован.

READ ALSO
Анти-паттерн сессия-на-операцию

Анти-паттерн сессия-на-операцию

В одной статье по Hibernate прочитал, что если вы хотите использовать многопоточность, то создавайте новую сессию для каждой CRUD-операцииТо есть...

113
ошибка при передаче данных между серверами

ошибка при передаче данных между серверами

В универе задали задание сделать сайт с усложненной архитектурой, чтобы был сервер на PHP, который от клиента принимал запросы, потом отправлял...

169