Для чего используется синхронизированный оператор?

Из чего использование synchronized операторы?

6
задан Seki 29 August 2012 в 14:52
поделиться

4 ответа

Это Java, построенный в форме взаимного исключения. Это используется для многопоточных приложений.

Учебник Sun по параллелизму

Здесь есть раздел о синхронизации, но если вы пытаетесь использовать многопоточные приложения, вам следует прочитать его целиком.

Wiki mutex

7
ответ дан 8 December 2019 в 04:09
поделиться

Они используются, когда вы создаете программу с большим количеством «потоков». Когда main запускается, он запускается с одного потока, который выполняет шаги в последовательности. Вы можете запустить гораздо больше потоков, которые затем могут выполнять код одновременно. Если вы выполняете один и тот же код в одно и то же время, все может вести себя не так, как вам нужно:

y = x+20;
// at this moment, before the next instruction starts, some other thread performs 
// the above step, which sets 'y' (an object property) to something different.
int b = y+10; // this would not be x+20, as you might expect.

Что вы хотите сделать, так это установить «блокировку» на этот блок кода, чтобы убедиться, что никакие другие поток может начать выполнение любого кода, который "синхронизирован" по переменной y.

synchronized (y) {
    y = x+20;
    int b = y+10;
} // lock gets released here

Теперь все другие потоки должны ждать, пока какой-либо поток, попавший туда первым, выйдет из блока и освободит блокировку, после чего другой поток захватит блокировку , входит в блок кода, выполняет его и снимает блокировку. Обратите внимание, что y должен быть объектом (Integer), а не примитивным типом.

Вы также можете добавить «synchronized» к методам, которые синхронизируются с «this» (объект-экземпляр) или class в случае статического метода.

Написание многопоточного кода затруднено из-за подобных проблем. Синхронизация - это один из инструментов, хотя у нее есть одна серьезная проблема - тупиковые ситуации. В Интернете много информации о тупиках.

12
ответ дан 8 December 2019 в 04:09
поделиться

Только 1 поток одновременно может получить доступ к синхронизированному блоку.

Это базовая языковая конструкция. Если вы совсем с ним не знакомы, вам нужно его просмотреть.

2
ответ дан 8 December 2019 в 04:09
поделиться

Он создает раздел кода, который в отношении двух или более потоков может (а) выполняться только одним потоком за раз и (b ) образует барьер памяти .

Хотя понять концепцию взаимного исключения, предотвращающую одновременное выполнение кода, довольно просто, не менее важным является барьер памяти.

Барьер памяти формирует «случается». перед "отношениями между двумя потоками. Любые изменения в памяти, сделанные потоком до получения блокировки, гарантированно будут соблюдены другим потоком после того, как он получит ту же самую блокировку. Из-за эффектов кешей ЦП и их взаимодействия с основной памятью это критически важно для предотвращения наблюдения и обновления устаревшей кэшированной памяти и предотвращения состояний гонки между потоками.

4
ответ дан 8 December 2019 в 04:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: