Есть два примера сихронизированного кода. В первом блокировка не работает, во втором работает. Почему я догадываюсь, но хотелось бы услышать детальное разьяснение. Спасибо!
//example #1
synchronized (new Object()) {
//...
}
//example #2
synchronized (Object.class) {
//...
}
synchronized (new Object()) {
Каждое исполнение этого кода запирает блок внутри {...}
на новом объекте. Так что друг другу эти исполнения не препятствуют. В то же время, описание типа Object
существует в одном экземпляре, поэтому
synchronized (Object.class) {
не дает другим потокам войти в блок {...}
.
Суть в том, что когда объявляешь синхронизированный блок кода ты должен передать ему объект на котором будет установлена блокировка. Это означает что когда поток попытается исполнить этот синхронизированный блок ему необходимо будет установить блокировку на переданный тобой объект и если другой поток уже установил на него блокировку, то он грубо говоря встанет в очередь на этот объект.
//example #1
synchronized (new Object()) {
//...
}
Вот это работать не будет по той причине, что каждый раз когда поток будет пытаться получить объект на котором ему необходимо установить блокировку будет создаваться новый объект, на котором разумеется не будет никаких блокировок да и вообще он свободен как ветер.
//example #2
synchronized (Object.class) {
//...
}
Будет работать по той причине, что объект получаемый таким образом единственен для всей программы, такой вшитый синглтон, потому что объекты представляющие из себя "описания классов" единственны (почти всегда). По этой причине описанной выше ситуации не возникнет, каждый раз когда поток будет пытаться выполнить этот синхронизированный блок он будет получать тот же объект что и все остальные потоки и корректно вставать в "очередь" если объект заблокирован.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
В одной статье по Hibernate прочитал, что если вы хотите использовать многопоточность, то создавайте новую сессию для каждой CRUD-операцииТо есть...
В универе задали задание сделать сайт с усложненной архитектурой, чтобы был сервер на PHP, который от клиента принимал запросы, потом отправлял...