В Java синхронизирането е от решаващо значение при едновременното програмиране, когато множество нишки имат достъп до споделени ресурси. Той гарантира, че само една нишка има достъп до критична секция в даден момент, предотвратявайки несъответствие в данните. Синхронизацията може да се приложи към методи или блокове от код. Синхронизация на метод срещу блок
цяло число към низ
Видове синхронизация
- Синхронизация на метода: Заключва целия метод, за да гарантира, че само една нишка го изпълнява в даден момент.
- Блокиране на синхронизация: Заключва само критичната част от кода в метода.
Необходима е синхронизация за променливи обекти, достъпни от множество нишки. Неизменните обекти или достъпът само за четене не изискват синхронизиране.
Синхронизация на метода
За да синхронизирате метод, добавете ключовата дума synchronized. Това гарантира, че само една нишка може да изпълни метода в даден момент.
Пример 1: Несинхронизиран метод
Javaclass Line { public void getLine() { for (int i = 0; i < 3; i++) { System.out.println(i); try { Thread.sleep(100); } catch (Exception e) { System.out.println(e); } } } } class Train extends Thread { Line line; Train(Line line) { this.line = line; } public void run() { line.getLine(); } } public class Geeks { public static void main(String[] args) { Line obj = new Line(); Train t1 = new Train(obj); Train t2 = new Train(obj); t1.start(); t2.start(); } }
Изход
0 0 1 1 2 2
Обяснение: Нишките t1 и t2 имат достъп до метода едновременно, причинявайки смесен изход.
Пример 2: Синхронизиран метод
Javaclass Line { synchronized public void getLine() { for (int i = 0; i < 3; i++) { System.out.println(i); try { Thread.sleep(100); } catch (Exception e) { System.out.println(e); } } } } class Train extends Thread { Line line; Train(Line line) { this.line = line; } public void run() { line.getLine(); } } public class Geeks { public static void main(String[] args) { Line obj = new Line(); Train t1 = new Train(obj); Train t2 = new Train(obj); t1.start(); t2.start(); } }
Изход
0 1 2 0 1 2
Обяснение: Само една нишка изпълнява метода в даден момент, осигурявайки съгласуваност на данните.
Блокиране на синхронизация
Блоковата синхронизация се използва, когато само част от метода съдържа критичен код. Това подобрява производителността, като позволява на нишките да изпълняват некритичен код едновременно.
за цикъл в c
Пример: Синхронизиран блок
Javaimport java.util.*; class Geek { String name = ''; public int count = 0; public void geekName(String geek List<String> list) { synchronized(this) { name = geek; count++; } list.add(geek); } } public class GFG { public static void main(String[] args) { Geek gk = new Geek(); List<String> list = new ArrayList<>(); gk.geekName('Mohit' list); System.out.println(gk.name); } }
Изход
Mohit
Обяснение: Синхронизират се само името и броят на актуализираните блокове. Добавянето на имена към списъка се изпълнява едновременно.
Синхронизация на метод срещу блок
| Характеристика | Синхронизация на метода | Блокиране на синхронизация |
|---|---|---|
| Обхват | Заключва целия метод | Заключва само конкретния блок от код |
| Изпълнение | Може да причини ненужно блокиране за некритичен код | По-ефективно се синхронизират само критични секции |
| Заключване | Получава заключването на обекта на метода | Получава заключването на обекта или класа, посочени в блока |
| Гъвкавост | Целият по-малко гъвкав метод е заключен | По-гъвкавият позволява селективна синхронизация |
Важни моменти
- Нишка, влизаща в синхронизиран метод/блок, получава заключване, което го освобождава при излизане.
- Методи/блокове на екземпляр: Придобиване на заключване на ниво обект.
- Статични методи/блокове: Придобийте заключване на ниво клас.
- Синхронизирането на нулеви обекти хвърля NullPointerException.
- wait() notify() и notifyAll() са ключови методи в синхронизацията.
- Избягвайте синхронизирането на неокончателни полета, за да попречите на нишките да заключват различни обекти.
- синхронизираната ключова дума не може да се прилага към променливи.
Предимства
- Осигурява взаимно изключване за споделени ресурси в многонишкови програми.
- Както синхронизираният екземпляр, така и статичните методи могат да се изпълняват едновременно, защото заключват различни обекти.
Ограничения
- Предотвратява едновременното четене, ограничавайки паралелността.
- Синхронизираните методи могат да влошат производителността. Предпочитайте блокова синхронизация само за критични секции.