В інформатиці, відношення відношення happened-before (англ. happened-before — «сталося раніше») (позначається: ) - це відношення між результатом двох подій, таким чином, що якщо одна подія повинна відбутися до іншої події, результат повинен відображати це, навіть якщо ці події насправді виконуються поза порядком (як правило, для оптимізації потоку програми). Це включає впорядкування подій на основі потенційного причинно-наслідкового зв’язку пар подій у паралельній системі, особливо асинхронних розподілених систем . Його сформулював Леслі Лампорт . Спеціально для Java відносини " раніше" - це гарантія того, що пам'ять, записана в оператор A, є видимою для оператора B, тобто те, що A завершує його запис до того, як твердження B розпочне його читання. [1] [Архівовано 6 січня 2020 у Wayback Machine.]

Ставлення happened-before формально визначається як найменш суворий частковий порядок подій:

  • Якщо події і відбуваються в одному і тому ж процесі, якщо поява події передує виникнення події .
  • Якщо подія це відправлення повідомлень та подія - це прийом повідомлень, відправлених у разі , .

Якщо між подіями в даній системі існують інші причинно-наслідкові зв’язки, наприклад, між створенням процесу та його першою подією, ці зв'язки також додаються до визначення.

Як і всі суворі часткові порядки, відносини, що відбулися раніше, є транзитивними, нерефлексивними та антисиметричними, тобто:

  • , якщо і , потім (транзитивність). Це означає, що для будь-яких трьох подій , якщо сталося раніше , і сталося раніше , потім повинно відбуватися раніше .
  • (нерефлексивність). Це означає, що жодна подія не може відбутися перед собою.
  • де , якщо потім (антисиметрія). Це означає, що для будь-яких двох різних подій , якщо сталося раніше потім не могло статися раніше .

Процеси, що складають розподілену систему, не знають відношення, що сталося раніше, якщо вони не використовують логічний годинник[en], наприклад, годинник Лампорт[en] або векторний годинник[en] . Це дозволяє розробляти алгоритми взаємного виключення та такі завдання, як налагодження чи оптимізація розподілених систем.