Синхронизация в Java: что, как и зачем?



Эта статья о синхронизации в Java поможет вам узнать о синхронизации многопоточных программ.

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

Я буду обсуждать темы в таком порядке:





Давайте начнем!

Зачем использовать синхронизацию в Java?



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

Синтаксис :

synchronized (objectidentifier) ​​{// Доступ к общим переменным и другим общим ресурсам}

Например, попытка записи в эквивалентный файл. Это может повредить данные, поскольку один из потоков может переопределить данные или когда поток открываетодин и тот же файл одновременно, другой поток может закрывать тот же файл.Возникает необходимость синхронизировать действие нескольких потоков. Это можно реализовать с помощью концепции, называемой M ониторы .



  • Каждый связан с монитором, который поток может блокировать или разблокировать.
  • Только один поток одновременно может удерживать блокировку на мониторе.
  • Ява язык программирования предоставляет очень удобный способ создания потоков и синхронизации их задач с помощью Синхронизировано блоки.
  • Он также сохраняет общие ресурсы в этом конкретном блоке.

Синхронизированные блоки в Java отмечены значком Синхронизировано ключевое слово. Этот блок в Java синхронизируется на каком-то объекте.Все блоки, которые синхронизируются на одном объекте, могут иметь только один поток, выполняющийся внутри них одновременно. Все другие потоки, пытающиеся войти в синхронизированный блок, блокируются до тех пор, пока поток внутри синхронизированного блока не выйдет из блока.

Типы синхронизации

В основном доступны два типа синхронизации. Они есть:

  1. Синхронизация процессов: Одновременное выполнение нескольких потоков или процессов для достижения состояния, при котором они совершают определенную последовательность действий.
  2. Синхронизация потоков: Иногда, когда более одного потокапытается получить доступ к общему ресурсу, вам необходимо убедиться, что ресурс будет использоваться только одним потоком ввремя.

Не будем вдаваться в подробности этих типов и попытаемся понять, что такое блокировки в .

что такое класс сканера в Java

Замки в Java

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

Начиная с Java 5, пакет java.util.concurrent.locks содержит множество реализаций блокировки.

Вот так выглядит замок:

public class Lock {private boolean isLocked = false public synchronized void lock () бросает InterruptedException {while (isLocked) {wait ()} isLocked = true} общедоступный синхронизированный void unlock () {isLocked = false notify ()}}

Метод lock () блокирует экземпляр Lock, так что все потоки, вызывающие lock (), блокируются до тех пор, пока не будет выполнена unlock ().

Многопоточность без синхронизации

Вот простой пример, который выводит значение счетчика в последовательности, и каждый раз, когда мы его запускаем, он дает другой результат в зависимости от доступности процессора для потока. Проверь это!

как обрабатывать всплывающие окна в селене
class Multithread {public void printCount () {try {for (int i = 5 i<0 i--) { System.out.println('Counter --- ' + i ) } } catch (Exception e) { System.out.println('Thread interrupted.') } } } class Thread extends Multithread { private Thread t private String threadName Multithread MT Thread( String name, Multithread mt) { threadName = name MT= mt } public void run() { MT.printCount() System.out.println('Thread ' + threadName + ' exiting.') } public void start () { System.out.println('Starting ' + threadName ) if (t == null) { t = new Thread (this, threadName) t.start () } } } public class TestThread { public static void main(String args[]) { Multithread MT = new Multithread() Thread t = new Thread( 'Thread - 1 ', MT) Thread t1 = new Thread( 'Thread - 2 ', MT) t.start() t1.start() // wait for threads to end try { t.join() t1.join() } catch ( Exception e) { System.out.println('Interrupted') } } }

Результат вышеупомянутой программы:

Вывод - Синхронизация в Java - Edureka

Многопоточность с синхронизацией

Это тот же пример, что и выше, но он печатает значение счетчика в последовательности. Каждый раз, когда мы запускаем его, он дает один и тот же результат.

class Multithread {public void printCount () {try {for (int i = 5 i> 0 i--) {System.out.println ('Counter ---' + i)}} catch (Exception e) {System. out.println ('Thread interrupted.')}}} class Thread extends Multithread {private Thread t private String threadName Multithread MT Thread (String name, Multithread mt) {threadName = name MT = mt} public void run () {synchronized ( MT) {MT.printCount ()} System.out.println ('Thread' + threadName + 'exiting.')} Public void start () {System.out.println ('Starting' + threadName) if (t == null) {t = new Thread (this, threadName) t.start ()}}} открытый класс TestThread {public static void main (String args []) {Multithread MT = new Multithread () Thread T = new Thread ('Thread - 1 ', MT) Thread T1 = new Thread (' Thread - 2 ', MT) T.start () T1.start () // ждем завершения потоков try {T.join () T1.join ()} catch (Exception e) {System.out.println ('Interrupted')}}}

Результат показан ниже:

Синхронизированное ключевое слово

синхронизированное ключевое слово отмечает блок или метод как критическую секцию. Критический раздел - это то, где одновременно выполняется только один поток, и поток удерживает блокировку для синхронизированного раздела. Эта синхронизированный ключевое слово помогает в написании одновременный части любого приложения. Он также защищает общие ресурсы внутри блока.

Ключевое слово synchronized можно использовать с:

Давайте обсудим блок кода.

Синхронизированное ключевое слово: блок кода

Синтаксис

Общий синтаксис для записи синхронизированного блока:

что такое * в sql
synchronized (lockObject) {// синхронизированные операторы}

Когда поток хочет выполнить синхронизированные операторы внутри блока, он должен получить блокировку на мониторе lockObject. Только один поток может одновременно получить монитор объекта блокировки. Таким образом, все остальные потоки должны дождаться, пока текущий выполняющийся поток не получит блокировку и не завершит свое выполнение.
Таким образом, синхронизированный ключевое слово гарантирует, что только один поток будет выполнять синхронизированные операторы блока за раз, и, таким образом, предотвращает повреждение несколькими потоками общих данных, которые присутствуют внутри блока.

Заметка :

  • Если поток переводится в спящий режим (используя спать() метод), то он не снимает блокировку. В течение этого времени ожидания ни один поток не будет выполнять операторы синхронизированного блока.
  • Синхронизация Java выкинет Исключение нулевого указателя если объект блокировки используется в ‘ синхронизированный (блокировка) ' нулевой.

Теперь давайте обсудим метод.

Синхронизированное ключевое слово: Метод

Синтаксис

Общий синтаксис для написания синхронизированный метод является:

синхронизированный метод (параметры) {// синхронизированный код}

Вот lockObject это просто ссылка на объект, блокировка которого связана с монитором, который представляет синхронизированные операторы.

Подобно синхронизированному блоку, поток должен получить блокировку подключенного объекта монитора с помощью метода synchronized. В случае синхронизированного метода объект блокировки:

  • Объект '.class' - если данный метод статический .
  • 'Этот' объект - если метод нестатический . «This» - это ссылка на текущий объект, в котором вызывается синхронизированный метод.

Ключевое слово синхронизации Java: повторно въезжающий в природе. Это означает, что если синхронизированный метод вызывает другой синхронизированный метод, который требует такой же блокировки, то текущий поток, который удерживает блокировку, может войти в этот метод без получения блокировки.

Давайте перейдем к последней теме этой статьи и укажем на основные различия между ключевым словом synchronized и блоком синхронизации.

Разница между синхронизированным ключевым словом и синхронизированным блоком

  • Когда вы используете синхронизированное ключевое слово с метод , он устанавливает блокировку объекта для всего метода. Это означает, что никакой другой поток не может использовать какой-либо синхронизированный метод, пока текущий вызываемый поток не завершит свое выполнение.
  • Синхронизировано блокировать устанавливает блокировку в объекте только в круглых скобках после указания ключевого слова synchronized. Это означает, что ни один другой поток не может получить блокировку уже заблокированного объекта, пока блок не завершится. Но другие потоки смогут получить доступ к остальной части кода, присутствующего в методе.

На этом мы подошли к концу статьи, где мы обсудили, как именно работает синхронизация в Java. Надеюсь, вы понимаете все, что было поделено с вами в этом руководстве.

Проверьте от Edureka, надежной компании по онлайн-обучению с сетью из более чем 250 000 довольных учащихся по всему миру. Мы здесь, чтобы помогать вам на каждом этапе вашего пути. Для того, чтобы стать помимо вопросов на собеседовании по Java, мы разработали учебную программу, предназначенную для студентов и профессионалов, которые хотят стать Java-разработчиками.

Есть вопрос к нам? Пожалуйста, укажите это в комментариях к этому «Синхронизация в Java. ' статья, и мы свяжемся с вами в ближайшее время.