Java. Чому локи потрібно тримати якомога менший час?

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

Реагування на “зовнішні“ події. Коли потоки не чекають довго на доступ до ресурсу через короткі блокування, вони можуть швидше реагувати на зовнішні події. Це може бути критично важливо для систем реального часу або для тих, які мають високі вимоги до часу відгуку(веб-сервери — обробка запитів, бази даних).

Зменшення ризику взаємоблокування. Тримання кількох блокувань одночасно або протягом тривалого часу збільшує ризик взаємоблокувань. Короткі інтервали блокувань мінімізують часове “вікно“, протягом якого інший потік може спробувати отримати блокування в іншому порядку та викликати взаємоблокування.

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

Інтерфейс: У додатках з графічним інтерфейсом, довгі блокування можуть призвести до "зависання"(пост про це) або затримок відгуку, що може погіршити враження від користування додатком.


public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread.sleep(5_000);

        final Object lock = new Object();
        MyThread t1 = new MyThread("My Thread 1", lock);
        MyThread t2 = new MyThread("My Thread 2", lock);

        Thread.sleep(1000);
        System.out.println(t2.getState());
        System.out.println(t1.getState());
    }
}

class MyThread extends Thread {
    private final Object lock;

    public MyThread(String name, Object lock) {
        setName(name);
        this.lock = lock;
        start();
    }

    @Override
    public void run() {
        synchronized (lock) {
            System.out.println("Hello from thread " + getName());
            while (true);
            // довгі обрахунки
        }
        // інша бізнес логіка яку необхідно виконати
    }
}
Результат запуску програми в консолі
Java process profiling. VisualVM

В профайлері бачимо наших два потоки — My Thread 1 і My Thread 2.
Оскільки перший потік запускається першим, він займає лок, другий потік, чекає на цьому лоці нескінченний час і переходить в заблокований стан. Через блокування, код потоку не буде виконано процесором — не буде використано процесорного часу, навідміну від першого потоку.

Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Oleksandr Klymenko
Oleksandr Klymenko@overpathz

Java Software Engineer

7KПрочитань
1Автори
93Читачі
На Друкарні з 19 квітня

Більше від автора

Вам також сподобається

  • Як вивести текст кирилицею в консолі C++?

    Гайд буде корисним та актуальним для початківців в справі кодингу, а особливо знадобиться бідним студентам, яких почали грузити величною та

    Теми цього довгочиту:

    Програмування
  • Хто такий Android-розробник? Повний путівник

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

    Теми цього довгочиту:

    Android
  • Why Java is the Most Popular Language for Selenium Automation Testing

    Explore why Java is the most popular language for Selenium automation testing, with strong community support, rich libraries, and easy integration.

    Публікація містить описи/фото насилля, еротики або іншого чутливого контенту.

    Теми цього довгочиту:

    Selenium Training

Коментарі (0)

Підтримайте автора першим.
Напишіть коментар!

Вам також сподобається

  • Як вивести текст кирилицею в консолі C++?

    Гайд буде корисним та актуальним для початківців в справі кодингу, а особливо знадобиться бідним студентам, яких почали грузити величною та

    Теми цього довгочиту:

    Програмування
  • Хто такий Android-розробник? Повний путівник

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

    Теми цього довгочиту:

    Android
  • Why Java is the Most Popular Language for Selenium Automation Testing

    Explore why Java is the most popular language for Selenium automation testing, with strong community support, rich libraries, and easy integration.

    Публікація містить описи/фото насилля, еротики або іншого чутливого контенту.

    Теми цього довгочиту:

    Selenium Training