Синхронизация данных в многоядерной среде (на основе Java)

Это мой первый вопрос, так что будьте осторожны со мной.

Что происходит, когда два потока, скажем, t1 и t2, работающие на отдельных ядрах ЦП, в одно и то же время вызывают синхронизированный метод для общего объекта, то есть в одном и том же цикле наносекунда / процессор? Как и по какому элементу архитектуры разрешается блокировка?

Это может показаться очевидным вопросом, но я не смог найти ничего в Интернете. Спасибо!

2 ответа

Решение

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

В случае Oracle HotSpot (JVM, на котором работает почти каждый): код C++ - это GNU, и, вероятно, ответ для вас найдется.

Но если вам просто нужна уверенность в том, что он "просто работает", спецификация дает вам это.

В наши дни это фактически реализуется аппаратно, поэтому у процессора есть специальная инструкция для предоставления одному потоку из множества доступа. Это произошло от чисто программного решения прошлого века, и современное состояние - это то, что представляет собой AtomicInteger: одно изменяемое целое число, которое гарантированно поточно-ориентированное, но никогда не блокируется.

Пример: архитектура Intel Haswell.

Другие вопросы по тегам