J
Java Машина
@java_mashina247 подп.
93просмотров
37.7%от подписчиков
3 октября 2024 г.
Score: 102
Happens before - это набор правил, которым необходимо следовать в многопоточном программировании, чтобы гарантировать корректное взаимодействие между потоками. Эти правила определяют, в каком порядке операции в разных потоках видят изменения, сделанные другими потоками, и обеспечивают предсказуемое поведение программы. ⚠ Это важно потому что, когда несколько потоков обращаются к общим данным или ресурсам, они могут делать это одновременно, что приводит к состояниям гонки (race conditions) и непредсказуемым ошибкам, если не учитывать правильный порядок взаимодействий. Концепция happens-before даёт инструменты для предотвращения этих проблем и обеспечивает, что одни действия обязательно произойдут и будут видны до других в определённых ситуациях. Правила: 1⃣ Правило порядка программы: Внутри одного потока все операции исполняются последовательно, то есть, если в коде метод x() вызывается до метода y(), то вызов x() happens-before вызова y(). int a = 5; // Happens-before int b = a + 2; // This happens after 2⃣ Правило блокировки (мониторов): Разблокировка монитора happens-before его последующей блокировки другим потоком. Это значит, что всё, что произошло до выхода из синхронизированного блока (разблокировка монитора) для одного потока, будет видно другому потоку, когда он войдёт в этот блок (захватит монитор). synchronized(lock) { sharedVar = 42; // Happens-before освобождения блокировки } // В другом потоке: synchronized(lock) { int value = sharedVar; // Здесь видно, что sharedVar = 42 } 3⃣ Правило volatile: Запись в volatile переменную happens-before последующее чтение этой переменной другим потоком. Это означает, что любое изменение переменной volatile будет немедленно видно всем другим потокам. volatile int flag = 0; // Поток 1: flag = 1; // Happens-before // Поток 2: if (flag == 1) { // Увидит изменение flag, так как volatile обеспечивает happens-before } 4⃣ Правило старта потока: Вызов метода Thread.start() для нового потока happens-before любой операции, выполняемой в этом потоке. То есть всё, что происходит до вызова start(), будет видно потоку, который был запущен. Thread t = new Thread(() -> { // Всё, что произошло до вызова t.start(), будет видно в этом потоке }); t.start(); // Happens-before операций в новом потоке 5⃣ Правило завершения потока: Завершение работы потока (через метод Thread.join()) happens-before тем, кто ожидает завершения этого потока. Это означает, что когда поток завершён и другой поток вызвал join(), все изменения, сделанные завершившимся потоком, будут видны потоку, который вызвал join(). Thread t = new Thread(() -> { sharedVar = 42; // Happens-before завершения потока }); t.start(); t.join(); // Поток, вызвавший join(), увидит изменения, сделанные потоком t 6⃣ Инициализация объекта: Завершение конструктора объекта happens-before тем, кто получает доступ к этому объекту. То есть, когда объект создан, и его конструктор завершён, другие потоки могут безопасно использовать этот объект. Object obj = new Object(); // Happens-before доступ к объекту
93
просмотров
3059
символов
Нет
эмодзи
Нет
медиа

Другие посты @java_mashina

Все посты канала →