Пример синхронизации Java | Синхронизация в Java Tutorial

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

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

Синхронизация используется с помощью того, что называется монитором. Монитор может принадлежать только одному потоку в данный момент времени. Когда поток «захватывает» монитор или «входит» в монитор, никакой другой поток не может войти в указанный монитор. Другой поток ожидает освобождения монитора. Поток, который уже владеет монитором, может повторно войти в него при необходимости. Монитор — это объект, который, таким образом, используется как взаимоисключающая блокировка.

Пример синхронизации Java

Синхронизация в Java — это возможность контролировать доступ нескольких потоков к любому общему ресурсу .

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

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

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

Синхронизация в основном используется для

  1. предотвращения столкновения потоков.
  2. Для предотвращения проблема согласованности.

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

В Java есть два типа синхронизации.

  1. Синхронизация процессов
  2. Синхронизация потоков

В этом посте мы обсудим только синхронизацию потоков.

Синхронизация потоков

Существует два типа синхронизации потоков.

взаимоисключающее и межпотоковое взаимодействие.

  1. Mutual Exclusive
    1. Синхронизированный метод.
    2. Синхронизированный блок.
    3. Статическая синхронизация.
  2. Сотрудничество (межпотоковое общение cation в java)

Mutual Exclusive помогает предотвратить взаимодействие потоков друг с другом при обмене данными. В java это можно сделать тремя способами:

  1. Используя синхронизированный метод
  2. Использование синхронизированного оператора
  3. Статическая синхронизация

Использование synchronized Методы

В Java со всеми объектами связаны неявные мониторы. Чтобы войти в монитор объекта, необходимо вызвать метод, который был изменен с помощью ключевого слова synchronized . Поток выходит из этого монитора, когда метод возвращается. Пока поток вызвал синхронизированный метод экземпляра, все остальные потоки, желающие ввести любой синхронизированный метод этого экземпляра, должны ждать.

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

См. Следующий пример SynDemo.java .

//SynDemo.javaclass  ControlTower {недействительное разрешение (строковое сообщение) {System.out.print ("[[" + сообщение); попробуйте {Thread.sleep (2000);} catch (InterruptedException e) {System.out.println ("Прервано");  } System.out.println ("]]");}} class Flight реализует Runnable {String message; ControlTower target; Thread t; public Flight (ControlTower targ, String s) {target = targ; message = s; t = new  Thread (this); t.start ();} public void run () {synchronized (target) {target.permission (message);}}} class SynDemo {public static void main (String [] args) {ControlTower target =  new ControlTower (); Flight flight1 = new Flight (цель, «Flight 1»); Flight flight2 = new Flight (target, «Flight 2»); Flight flight3 = new Flight (target, «Flight 3»); попробуйте {flight1  .t.join (); flight2.t.join (); flight3.t.join ();} catch (InterruptedException e) {System.out.println ("Interrupted");}}} 

Здесь отдельные потоки создаются в классе Flight , который вызывает разрешение void (String message ) класса ControlTower для передачи указанного сообщения.

Теперь в основном методе один экземпляр класса ControlTower создается, а три экземпляра Flight — созданы, которые взаимодействуют с одним и тем же экземпляром ControlTower target .

Как видите, Thread .sleep (2000) переводит каждый поток в спящий режим на 2 секунды, что означает, что другой поток может свободно вызывать метод (String message) , даже если один поток не полностью завершил выполнение . В нашем примере это приводит к катастрофическим последствиям — самолеты приземляются один за другим без очистки взлетно-посадочной полосы.

См. Выходные данные ниже..

Чтобы исправить это, требуется только одно изменение в над программой. Разрешение метода должно быть синхронизировано , что означает, что никакой другой поток не может вызывать его до тех пор, пока входящий поток не является выходом.

//SynDemo.javaclass ControlTower {синхронизированное недействительное разрешение (строковое сообщение) {System.out.print ("[[" + message); попробуйте {Thread.sleep (2000);} catch (InterruptedException e)  {System.out.println ("Interrupted");} System.out.println ("]]");}} class Flight реализует Runnable {String message; ControlTower target; Thread t; public Flight (ControlTower targ, String s)  {target = targ; message = s; t = new Thread (this); t.start ();} public void run () {target.permission (message);}} class SynDemo {public static void main (String []  args) {ControlTower target = new ControlTower (); Flight flight1 = new Flight (цель, "Flight 1"); Flight flight2 = new Flight (цель, "Flight 2"); Flight flight3 = new Flight (target, "Flight 3  "); попробуйте {flight1.t.join (); flight2.t.join (); flight3.t.join ();} catch (InterruptedException e) {System.out.println (" Interrupted ");}}}  

См. т он следующий вывод.

Использование synchronized statement

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

См. Следующий пример.

 class ControlTower {синхронизированное недействительное разрешение (строковое сообщение) {System.out.print  ("[[" + message); попробуйте {Thread.sleep (2000);} catch (InterruptedException e) {System.out.println ("Interrupted");} System.out.println ("]]");}  } class Flight реализует Runnable {String message; ControlTower target; Thread t; public Flight (ControlTower targ, String s) {target = targ; message = s; t = new Thread (this); t.start ();} public void  run () {target.permission (message);}} class SynDemo {public static void main (String [] args) {ControlTower target = new ControlTower (); Flight flight1 = new Flight (target, "Flight 1"); Flight  flight2 = new Flight (цель, "Flight 2"); Flight flight3 = new Flight (target, "Flight 3"); попробуйте {flight1.t.join (); flight2.t.join (); flight3.t.join  ();} catch (InterruptedException e) {System.out.println ("Interrupted");}}} 

См. вывод.

Наконец, Java Sync хронизированный Пример | Синхронизация в Java Tutorial завершена.

Оцените статью
nanomode.ru
Добавить комментарий