Синхронизация под крышками
Я пытался погрузиться в синхронизацию.
здесь упоминается "Каждый объект имеет встроенную блокировку, связанную с ним".
Я понимаю класс объекта. Его (довольно известный нам) не имеет никакого свойства, такого как блокировка (таким образом, я предполагаю, что это называется встроенной блокировкой). Что именно представляет собой эта блокировка (т.е. это класс Lock.java? Это своего рода скрытое поле?) И как он связан с объектом (то есть существует ли какая-то загадочная неявная ссылка на блокировку от объекта, что-то происходит по-своему))
When several threads try to acquire the same lock, one or more threads will be suspended and they will be resumed later.
Ну где хранятся эти темы? Какая структура данных ведет учет ожидающих потоков?Какая логика используется под прикрытием, чтобы выбрать поток, ожидающий входа в синхронизированный метод, когда их много?
Любая ссылка на то, что происходит под прикрытием (шаг за шагом) от "синхронизированного ключевого слова" до "внутреннего захвата блокировки"?
Существует ли верхний предел количества потоков, которым разрешено ждать при синхронизации?
1 ответ
1) Да, замок - это, по сути, скрытое поле на объекте. Вы не можете получить к нему доступ, кроме как через синхронизацию.
2) Ожидание потоков по сути просто спит, пока блокировка не станет доступной. Они не "хранятся" в каком-то особенном месте и не имеют видимой очереди ожидающих потоков. Детали реализации скрыты.
3) Я не думаю, что есть какой-либо обещанный заказ. Если вам явно требуется циклическое планирование или расстановка приоритетов или что-то в этом роде, вы несете ответственность за реализацию этого (или использование класса, который реализует это для вас) поверх механизма блокировки синхронизации.
4) Это, вероятно, будет рассматриваться как семафор ОС, если вы понимаете это. Если вы этого не сделаете, определение их поразит меня слишком большим количеством деталей, чтобы их можно было правильно рассмотреть здесь... и вам действительно не нужно понимать это, если вы не реализуете это.
5) Насколько я знаю, явного ограничения нет. (Я не проверял официальную Спецификацию Java, но я понимаю, как такого рода вещи реализуются на уровне ОС.) Конечно, в какой-то момент у вас закончатся системные ресурсы, но я думаю, что вы в целом сначала исчерпать другие ресурсы (например, память для запуска этих потоков).
Еще одно примечание: это также стоит посмотреть на Atomic
... занятия. Когда их можно использовать, они будут несколько более эффективными в современных процессорах, чем традиционная синхронизация Java.