27. Соб.2 Что происходит после вызова метода notifyAll? Какие выгоды получает объект, если он immutable? Что такое «thread-safe»? Что такое «happens-before»? Что такое JMM? Какое исключение вылетит, если вызвать wait не в блоке synchronized?

  27.6 Що відбувається після виклику метода notifyAll?

notifyAll() надсилає сповіщення всім ниткам у стані очікування звільнення об’єкта-мютекса; всі нитки пробуджуються; як тільки поточна нитка вийде з блока synchronized, одна з пробуджених ниток займе мютекс; решта ниток після перевірки умови цикла знов перейдуть у стан очікування (хибне пробудження).

 

27.7  Які переваги отримує об’єкт, якщо він immutable?

Immutable  (незмінний)  об’єкт – це об’єкт, стан якого після створення неможливо змінити (всі поля екземпляру позначені final).  Найпростіший приклад – java.lang.String. Всі методи, які викликаються повертають новий рядок, а не модифікований вихідний.

Переваги immutable-обєктів:

1)      Потокобезпечність – Іm-o не вимагають синхронізації при багато потоковому доступі, їх вільно можна використовувати з різних потоків.

2)      Простота – Im-о простіші для розуміння, реалізовуються значно простіше, ніж змінювані обєкти.

 

27.8 Що таке «thread-safe»?

Thread-safe означає, що метод або екземпляр обєкту може безпечно (без дедлоку)  використовуватися у багато поточному середовищі.

Інструменти забезпечення потокобезпечності:

1)       синхронізація;

2)      immutable обєкти;

3)      атомарні операції пакету java.util.concurrent.atomic (н-д AtomicInteger);

4)      використання блокувань пакету java.util.concurrent.locks;

5)       використання потокобезпечних класів (н-д ConcurrentHashMap);

6)      використання ключового слова volatile;

7)      final і local поля є також потокобезпечними.


 27.9  Що таке «happens-before»?

happens-before - набір правил для упорядкування JVM послідовності виконання операцій. Щоб гарантувати, що програмний потік, що виконує операцію Y, може бачити результати дії Х (незалежно від того, відбуваються операції Х та Y у одному потоці чи різних) між Х та Y  має бути відношення happens-before. 

https://vidpovidinapytanniaprojava.blogspot.com/2023/04/goto-wait-synchronized-happens-before.html

 

27.10  Що таке JMM?

Модель пам’яті java (англ. Java Memory ModelJMM) – частина семантики мови java – визначає правила взаємодії віртуальної машини java (JVM) з пам’яттю комп’ютера (RAM). JVM є моделлю комп’ютера, тому ця модель включає в себе модель памяті -   JMM. На сьогодні використовується модель памяті Java 1.5.

JMM є дуже важливою при розробці багато потокових програм. Вона визначає

як і коли різні потоки можуть бачити значення, записані в спільні змінні іншими потоками,

як синхронізувати доступ до спільних ресурсів,

послідовне виконання дій, які пов’язані happens-before.

Модель пам'яті Java, яка використовується всередині JVM, розділяє пам'ять між стеком кожного потоку і кучою.

(Стек (stack) містить інформацію про те, які методи викликав потік для досягнення поточної точки виконання (стек викликів) та локальні змінні кожного з цих методів. Коли потік виконує свій код, стек викликів змінюється. Потік може отримати доступ лише до власного стеку потоків. Локальні змінні, створені потоком, невидимі для всіх інших потоків. Навіть якщо два потоки виконують один і той самий код, вони створюватимуть власні локальні змінні кожен у своєму стеку.  Один потік може передавати копію примітивної змінної в інший потік, тоді потоки працюють кожен зі своєю копією змінної.

Куча (heapмістить усі обєкти, створені у програмі, незалежно від того, який потік їх створив. В тому числі у кучі зберігаються версії об’єктів примітивних типів (IntegerLong тощо).   

Отже, локальна змінна примітивного типу зберігається в стеку потоку. Локальна змінна як посилання на обєкт зберігається також у стеку потоку, але сам обєкт зберігається в кучі.

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

До обєктів у кучі і їх змінних можуть отримати доступ всі потоки, які мають посилання на обєкт)

--------

 

27.11  Який виняток вилетить, якщо викликати wait не в блоці  synchronized?

IllegalMonitorStateException

Коментарі

Популярні дописи з цього блогу

27 Гугл 1 goto. Зарезервовані (ключові) слова. wait не в блоці synchronized. happens-before. BlockingQueue. Методи BlockingQueue

28. Соб 1. Какие приоритеты нитей бывают? Можно ли остановить нить, снизив ее приоритет до 0? Зачем нужен класс ThreadGroup? В какой группе нитей состоит main-thread? Что такое паттерн ThreadPool?