Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Лучший способ объяснить happens-before  [new]
DEVcoach
Member

Откуда:
Сообщений: 189
Коллеги,

Happens-before - очень простая идея для тех, кто ее уже вкурил. Но как ее вменяемо объяснить новичкам? В документации и туториалах Java объяснено плохо, в Java Concurrency in Practice тоже. Все не то.

Я пытался сформулировать мое понимание этого как можно более понятно, и в итоге пришел к такому определению.
Если:
1) Поток A изменил состояние системы S (write),
2) поток B заметил это изменение (read),
3) и операции изменения и чтения состояния S связаны соотношением happens-before,
то все последующие операции потока B увидят все изменения, совершенные потоком A до изменения состояния S.

На мой взгляд, это корректное, годное определение. Если подкрепить его картинками и парочкой примером, то слушатель все поймет. НО!!!
1) Согласны ли вы с тем, что это утверждение корректно? Ведь по сути здесь я ставлю знак равенства между happens-before и acquire/release семантикой. Правомерно ли это? Можно ли, например, утверждать, что happens-before на Thread.interrupt -> Thread.isInterrupted или Thread.start() -> тело Runnable() имеют acquire/release семантику? Вот что-то у меня здесь сомнения есть. Боюсь, надо будет в concurrency interest писать на эту тему.
2) Оно мне кажется слишком громоздким. Как его упростить? В принципе, неплохо написано вот здесь http://preshing.com/20130702/the-happens-before-relation (всем рекомендую забукмаркать этот интереснейший бложег), но немного неполно.
15 авг 13, 20:54    [14715430]     Ответить | Цитировать Сообщить модератору
 Re: Лучший способ объяснить happens-before  [new]
забыл ник
Member

Откуда:
Сообщений: 3370
Вы немного себе противоречите, сначала спрашиваете как проще всего обьяснить новичкам, а потом спрашиваете о тонкостях точного и корректного описания. Нужна точность и хитрости - значит обьяснение формально. Нужно быстрое понимание в общем - значит неформально на пальцах донести идею, а потом переходить к тонкостям.

Где-то видел такой пример в виде слайдов -

1) Потоки устроены хитро, запись и чтение переменной в одном потоке не гарантирует правильный и мгновенный результат в другом потоке
2) Нужны гарантии
3) гарантии предоставляются Java Memory Model
4) Посредством соглашений и расставления некоторых инструкций в определенных точках программы, все это называется happens-before
5) список
6) тонкости

Конечно я уже имел понятие о хэппенс-бефоре но мне понравилось, стиль не авторский, а в моем пересказе.

Как по мне ваши вариант

автор
1) Поток A изменил состояние системы S (write),
2) поток B заметил это изменение (read),
3) и операции изменения и чтения состояния S связаны соотношением happens-before,


Сбивает с толку - такое ощущение что потоки сами что-то делают как-то синхронизируются, а вся соль в том что программист должен управлять кодом и расставлять happens-before.

Все написанное сугубо мое имхо.
15 авг 13, 21:21    [14715483]     Ответить | Цитировать Сообщить модератору
 Re: Лучший способ объяснить happens-before  [new]
maxkar
Member

Откуда:
Сообщений: 159
DEVcoach
то все последующие операции потока B увидят все изменения, совершенные потоком A до изменения состояния S.

1) Согласны ли вы с тем, что это утверждение корректно?

Вот эта часть некорректна. Там все сложнее. В целом JVM говорит даже не о том, какие записи будут видны, а о том, какие записи будут не видны. В случае корректно синхронизированных программ ваше определение более-менее корректно. Но вот в случае некорректно синхронизированных потоков может вводить в заблуждение.

DEVcoach
Ведь по сути здесь я ставлю знак равенства между happens-before и acquire/release семантикой. Правомерно ли это? Можно ли, например, утверждать, что happens-before на Thread.interrupt -> Thread.isInterrupted или Thread.start() -> тело Runnable() имеют acquire/release семантику? Вот что-то у меня здесь сомнения есть. Боюсь, надо будет в concurrency interest писать на эту тему.

Оно похоже на acquire/release. Но вот "количество" не сохраняется в отличие честных семафоров. Один volatile write может happens-before нескольких volatile read. А еще оно на Lamport timestamps очень похоже.

DEVcoach
2) Оно мне кажется слишком громоздким. Как его упростить?

А смысл? Новичкам важнее донести мысль о том, что программа должна быть "корректно синхронизирована". В этом случае на программе вроде бы появляется total order, причем согласованный с порядком инструкций в каждом потоке. А в некорректно синхронизированной программе еще и causality requirement важен. По сравнению с ним любое объяснение happens-before - мелочи.

P.S. здесь я писал (Maxim Karvonen) примерно о том же (оно вроде бы еще и causality requirement неплохо покрывает). Это как раз lamport timestamps.
16 авг 13, 09:39    [14716669]     Ответить | Цитировать Сообщить модератору
 Re: Лучший способ объяснить happens-before  [new]
DEVcoach
Member

Откуда:
Сообщений: 189
ААА! Все, я нашел доказательство! Читаем главы 17.4.4 и 17.4.5! То есть,
1) synchronized-with это как раз таки acquire-release семантика, которая действует при:
- acquire/release монитора
- volatile read/write
- thread.start()/первая команда в новом треде
- последняя команда в треде / thread.join()-thread.isAlive()

2) А happens-before это видимость одного конкретного изменения между тредами, которая возникает:
- Всегда в рамках одного треда
- финиш конструктора - вход в finalize()
- все synchronized-with сценарии

Ну пипец, и как теперь вот это вот объяснять людям? Помозгую я конечно над простым объяснением, но чую таки придется делать ставку на объяснение "на пальцах". Плюс визуальный ряд должен сильно помочь.
16 авг 13, 09:40    [14716676]     Ответить | Цитировать Сообщить модератору
 Re: Лучший способ объяснить happens-before  [new]
chabapok
Member

Откуда: Харьков
Сообщений: 763
DEVcoach,

на ютубе глянье конференции. Там были в том числе нормальные обьяснения, с нормальными понятными слайдами.
16 авг 13, 11:16    [14717348]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Лучший способ объяснить happens-before  [new]
faustgreen
Member

Откуда:
Сообщений: 386
Вход/выход в синхронайзд блок - это happen-before.
Чтение/запись volatile-переменной тоже.

Вопрос, если чтение/запись volatile переменной всеми потоками происходит внутри синхронайзд блока, то ключевое слово volaitle для этой переменной можно не использовать?

В коде ниже нужно указыввать volatile?

public class SimpleLockImplementation {
	  private boolean isLocked = false;

	  public synchronized void lock() throws InterruptedException{
	    while(isLocked){
	      wait();
	    }
	    isLocked = true;
	  }

	  public synchronized void unlock(){
	    isLocked = false;
	    notify();
	  }
}
30 июн 20, 09:29    [22159448]     Ответить | Цитировать Сообщить модератору
 Re: Лучший способ объяснить happens-before  [new]
забыл ник
Member

Откуда:
Сообщений: 3370
1) не нужно обьявлять volatile
2) лучше использовать notifyAll
30 июн 20, 12:44    [22159604]     Ответить | Цитировать Сообщить модератору
 Re: Лучший способ объяснить happens-before  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8775
https://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html
30 июн 20, 12:55    [22159611]     Ответить | Цитировать Сообщить модератору
 Re: Лучший способ объяснить happens-before  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3090
мне вот интересно а где все это напрямую используется?
я уже хренову тонну реальных проектов перелопатил
все что я встречал это ComletableFeature
мб у нее там под капотом эта вся шляпа лежит)
но тоесть вот явно чтобы кто то там лочил ,семафорил и тд - я не видел ни разу
30 июн 20, 22:26    [22160000]     Ответить | Цитировать Сообщить модератору
 Re: Лучший способ объяснить happens-before  [new]
mayton
Member

Откуда: loopback
Сообщений: 47981
Они говорят о самых low-level примитивах синхронизации на базе которых строятся боле высокоуровневые.

SimpleLockImplementation - это иммитиация стандартного Lock на примитивах. Похоже на тестовое задание.
В проде щас никто так не делает ибо нет смысла.
1 июл 20, 10:06    [22160088]     Ответить | Цитировать Сообщить модератору
 Re: Лучший способ объяснить happens-before  [new]
mayton
Member

Откуда: loopback
Сообщений: 47981
В проде можно брать ReentrantLock, или StampedLock.
1 июл 20, 10:45    [22160098]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить