logo

Метод Java і синхронізація блоків

У Java синхронізація має вирішальне значення в паралельному програмуванні, коли кілька потоків отримують доступ до спільних ресурсів. Це гарантує, що лише один потік одночасно отримує доступ до критичного розділу, запобігаючи неузгодженості даних. Синхронізацію можна застосувати до методів або блоків коду. Синхронізація методів і блоків

рекха індійська

Види синхронізації

  • Метод Синхронізація: Блокує весь метод, щоб гарантувати, що лише один потік виконує його одночасно.
  • Синхронізація блоків: Блокує лише критичну частину коду в межах методу.

Синхронізація потрібна для змінних об’єктів, доступ до яких здійснюється кількома потоками. Незмінні об’єкти або доступ лише для читання не потребують синхронізації.

Синхронізація методу

Щоб синхронізувати метод, додайте ключове слово synchronized. Це гарантує, що тільки один потік може виконувати метод одночасно.



Приклад 1: несинхронізований метод

Java
class 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: Синхронізований метод

Java
class 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 

Пояснення: Тільки один потік виконує метод одночасно, що забезпечує узгодженість даних.

Синхронізація блоку

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

змінити файл linux

Приклад: Синхронізований блок

Java
import 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() є ключовими методами синхронізації.
  • Уникайте синхронізації нефінальних полів, щоб потоки не блокували різні об’єкти.
  • synchronized ключове слово не можна застосувати до змінних.

Переваги

  • Забезпечує взаємне виключення спільних ресурсів у багатопоточних програмах.
  • І синхронізовані екземпляри, і статичні методи можуть працювати одночасно, оскільки вони блокують різні об’єкти.

Обмеження

  • Запобігає одночасному читанню, обмежуючи паралельність.
  • Синхронізовані методи можуть погіршити продуктивність. Віддавайте перевагу синхронізації блоків лише для критичних розділів.
Створіть вікторину