Коли ми починаємо два або більше потоків в рамках програми, може виникнути ситуація, коли кілька потоків намагаються отримати доступ до одного ресурсу і, нарешті, вони можуть привести до непередбачених результат через проблеми паралелізму. Наприклад, якщо кілька потоків намагаються писати в той же файл, то вони можуть привести до пошкодження даних, тому що один з потоків може overrite даних або в той час як один потік відкриває той же файл в той же час інший потік може закривати один і той ж файл.
Таким чином, існує необхідність синхронізувати дію кількох потоків і переконайтеся, що тільки один потік може отримати доступ до ресурсу в даний момент часу. Це реалізується з використанням концепції під названіеммоніторов. Кожен об'єкт в Java пов'язаний з монітором, який нитка може блокування або розблокування. Тільки один потік одночасно може утримувати блокування на моніторі.
Мова програмування Java забезпечує дуже зручний спосіб створення потоків і синхронізації їх завдання з помощьюсінхронізірованних блоків. Ви тримаєте загальні ресурси в межах цього блоку. Нижче наводиться загальна форма синхронізованою заяви:
Здесьobjectidentifier є посиланням на об'єкт. чий замок асоціюється з монітором. який представляє синхронізований заяву. Тепер ми будемо бачити два приклади, де ми надрукуємо лічильник за допомогою двох різних потоків. Коли потоки не синхронізовані, вони друкують значення лічильника, яке не в послідовності, але коли ми виводимо лічильник, помістивши всередині синхронізованого () блоку, то він друкує лічильник дуже багато в послідовності для обох потоків.
Нить приклад без синхронізації:
Ось простий приклад, який може або не може друкувати значення лічильника в послідовності і кожен раз, коли ми біжимо, він виробляє різний результат залежно від наявності процесора до потоку.
Це дає інший результат кожного разу при запуску цієї програми:
Нить приклад з синхронізацією:
Ось той же приклад, який друкує значення лічильника в послідовності і кожен раз, коли ми біжимо, він виробляє той же самий результат.
Це дає той же результат кожного разу при запуску цієї програми: