powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Лучший способ объяснить happens-before
11 сообщений из 11, страница 1 из 1
Лучший способ объяснить happens-before
    #38368203
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги,

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 (всем рекомендую забукмаркать этот интереснейший бложег), но немного неполно.
...
Рейтинг: 0 / 0
Лучший способ объяснить happens-before
    #38368215
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы немного себе противоречите, сначала спрашиваете как проще всего обьяснить новичкам, а потом спрашиваете о тонкостях точного и корректного описания. Нужна точность и хитрости - значит обьяснение формально. Нужно быстрое понимание в общем - значит неформально на пальцах донести идею, а потом переходить к тонкостям.

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

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

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

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

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

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

Все написанное сугубо мое имхо.
...
Рейтинг: 0 / 0
Лучший способ объяснить happens-before
    #38368458
maxkar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 очень похоже.

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

P.S. здесь я писал (Maxim Karvonen) примерно о том же (оно вроде бы еще и causality requirement неплохо покрывает). Это как раз lamport timestamps.
...
Рейтинг: 0 / 0
Лучший способ объяснить happens-before
    #38368460
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ААА! Все, я нашел доказательство! Читаем главы 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 сценарии

Ну пипец, и как теперь вот это вот объяснять людям? Помозгую я конечно над простым объяснением, но чую таки придется делать ставку на объяснение "на пальцах". Плюс визуальный ряд должен сильно помочь.
...
Рейтинг: 0 / 0
Лучший способ объяснить happens-before
    #38368656
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoach,

на ютубе глянье конференции. Там были в том числе нормальные обьяснения, с нормальными понятными слайдами.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Лучший способ объяснить happens-before
    #39974417
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вход/выход в синхронайзд блок - это happen-before.
Чтение/запись volatile-переменной тоже.

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

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

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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();
	  }
}
...
Рейтинг: 0 / 0
Лучший способ объяснить happens-before
    #39974523
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) не нужно обьявлять volatile
2) лучше использовать notifyAll
...
Рейтинг: 0 / 0
Лучший способ объяснить happens-before
    #39974528
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Лучший способ объяснить happens-before
    #39974803
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне вот интересно а где все это напрямую используется?
я уже хренову тонну реальных проектов перелопатил
все что я встречал это ComletableFeature
мб у нее там под капотом эта вся шляпа лежит)
но тоесть вот явно чтобы кто то там лочил ,семафорил и тд - я не видел ни разу
...
Рейтинг: 0 / 0
Лучший способ объяснить happens-before
    #39974836
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Они говорят о самых low-level примитивах синхронизации на базе которых строятся боле высокоуровневые.

SimpleLockImplementation - это иммитиация стандартного Lock на примитивах. Похоже на тестовое задание.
В проде щас никто так не делает ибо нет смысла.
...
Рейтинг: 0 / 0
Лучший способ объяснить happens-before
    #39974844
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В проде можно брать ReentrantLock, или StampedLock.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Лучший способ объяснить happens-before
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]