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 Model, JMM) – частина семантики мови java – визначає правила взаємодії віртуальної машини java (JVM) з пам’яттю комп’ютера (RAM). JVM є моделлю комп’ютера, тому ця модель включає в себе модель пам’яті - JMM. На сьогодні використовується модель пам’яті Java 1.5.
JMM є дуже важливою при розробці багато потокових програм. Вона визначає
як і коли різні потоки можуть бачити значення, записані в спільні змінні іншими потоками,
як синхронізувати доступ до спільних ресурсів,
послідовне виконання дій, які пов’язані happens-before.
Модель пам'яті Java, яка використовується всередині JVM, розділяє пам'ять між стеком кожного потоку і кучою.
(Стек (stack) містить інформацію про те, які методи викликав потік для досягнення поточної точки виконання (стек викликів) та локальні змінні кожного з цих методів. Коли потік виконує свій код, стек викликів змінюється. Потік може отримати доступ лише до власного стеку потоків. Локальні змінні, створені потоком, невидимі для всіх інших потоків. Навіть якщо два потоки виконують один і той самий код, вони створюватимуть власні локальні змінні кожен у своєму стеку. Один потік може передавати копію примітивної змінної в інший потік, тоді потоки працюють кожен зі своєю копією змінної.
Куча (heap) містить усі об’єкти, створені у програмі, незалежно від того, який потік їх створив. В тому числі у кучі зберігаються версії об’єктів примітивних типів (Integer, Long тощо).
Отже, локальна змінна примітивного типу зберігається в стеку потоку. Локальна змінна як посилання на об’єкт зберігається також у стеку потоку, але сам об’єкт зберігається в кучі.
Якщо обє’кт містить методи, а вони, в свою чергу містять локальні змінні – ці змінні зберігаються у стеку потоку. Змінні самого об’єкта, незалежні від методів об’єкта, зберігаються в кучі разом з цим об’єктом. Статичні змінні класу зберігаються разом із визначенням класу у кучі.
До об’єктів у кучі і їх змінних можуть отримати доступ всі потоки, які мають посилання на об’єкт)
--------
27.11 Який виняток вилетить, якщо викликати wait не в блоці synchronized?
IllegalMonitorStateException
Коментарі
Дописати коментар