|
|
|
shared object for signaling purposes
|
|||
|---|---|---|---|
|
#18+
MySignal явл-ся shared для двух тредоф, один из которых только читает, второй только может устанавливать hasDataToProcess. Нужен ли в этом случае synchronized на методах? @Named("sharedSignal") public class MySignal{ protected boolean hasDataToProcess = false; public synchronized boolean hasDataToProcess(){ return this.hasDataToProcess; } public synchronized void setHasDataToProcess(boolean hasData){ this.hasDataToProcess = hasData; } } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2016, 16:07 |
|
||
|
shared object for signaling purposes
|
|||
|---|---|---|---|
|
#18+
rema174, Имхо, volatile и без синхронайзед на обоих методах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2016, 20:14 |
|
||
|
shared object for signaling purposes
|
|||
|---|---|---|---|
|
#18+
just_vladimir, imho, если пишушщий тред будет устанавливать hasDataToProcess в момент чтения этого значения читающим тредом, то может произойти конфликт. как я понимаю шансы малы, но они есть на такое совпадение, и поэтому там synchronized. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2016, 23:45 |
|
||
|
shared object for signaling purposes
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2016, 11:40 |
|
||
|
shared object for signaling purposes
|
|||
|---|---|---|---|
|
#18+
just_vladimir, авторanother approach ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2016, 12:08 |
|
||
|
shared object for signaling purposes
|
|||
|---|---|---|---|
|
#18+
just_vladimir, волтаил не атомарен. Инструкция на jls написана сухим языком, ее специалисту трудно бывает понять, а вы даете человеку который вообще не понимает. Если 1 поток он читает ваш волатил, потом делает dataProcess и потом делает hasDataToProcess=false, то будет лажа. Будет и с synchronized и c volatile. Самое простое в этом случае - это делать dataProcess внутри того же synchronized. rema174, в такой формулировке вопроса как у вас, volatile самое оно. Но скорей всего, вы неверно сформулировали задачу. На это как бы намекает название hasDataToProcess и ваш класс вообще. То есть, у вас есть данные, есть обработка. Обработка имеет начало и конец, логично предположить что вконце обработки ваши данные_для_процесса перестают наличествовать, то есть после обработки надо hasDataToProcess поставить в false, а это уже конфликтует с условием задачи "один из которых только читает, второй только может устанавливать". Хотя, это зависит от конкретного алгоритма. Например, если он обрабатывает каждый раз при проходе - то можно. Но не всегда, а только когда сами данные правильно опубликовались в другой поток. Если у вас несколько потоков - мало объявить доступ к каждой переменной в synchronized. Это вообще ничего не даст, т.к. между разными synchronized оно рассинхронизируется. В простом случае надо выполнять все внутри одного synchronized. Псевдокод: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Но это если вам нужна однократная обработка. Если вам многократную, тогда можно volatile, но возникает проблема безопасной публикации из одного потока в другой самих данных. Т.е, если вы сделаете так: Код: java 1. 2. 3. 4. 5. 6. 7. Тут сама по себе проверка - ок, но надо быть готовым к тому, что поток 2 будет внутри processData(), а поток 1 их начнет в это время менять. В потоке 2 внутри вашего processData() часть данных считаются в старых значениях - а часть в новых. Иногда это оно, а иногда это не то, что вы хотите. Все зависит от "обвеса". Так что с этой многопоточностью надо быть очень осторожным. Есть еще 1 психологический момент - если ты попытался сделать что-то сложное многопоточное, то твой мозг привыкает, что внутри if (условие) это условие может быть false из за действий другого потока. То есть, ты перестаешь быть уверенным буквально во всем. И потом, переключившись на написание однопоточного кода, какое-то время сложно соображать с той же скоростью как ты делал это раньше, потому что твой мозг постоянно тебе подбрасывает тебе идеи в стиле "а вдруг кто-то с другого потока прийдет и нагадит", ну и вообще начинаешь во всем сомневаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2016, 22:35 |
|
||
|
shared object for signaling purposes
|
|||
|---|---|---|---|
|
#18+
just_vladimirvolatile и без синхронайзед на обоих методах+128 rema174, Т.к. volatile гарантирует атомарность операции чтения/записи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2016, 22:49 |
|
||
|
shared object for signaling purposes
|
|||
|---|---|---|---|
|
#18+
chabapokа вы даете человеку который вообще не понимает ну так и вообще. я кагбе и применяю по мелочам) до сих работало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2016, 23:05 |
|
||
|
shared object for signaling purposes
|
|||
|---|---|---|---|
|
#18+
chabapok, развернутый ответ получился, хотя вопрос был куда уже первый варинант развития событий вполне подходит к условию где только два потока а что касается второго варината, то что значит многократная обработка? chabapokнадо быть готовым к тому, что поток 2 будет внутри processData(), а поток 1 их начнет в это время менять. В потоке 2 внутри вашего processData() часть данных считаются в старых значениях - а часть в новых. можно сделать флаг (volatile?), чтобы поток 1 знал что второй поток "работает", но тоже самое сделает и synchronized, т.о. поток 1 не сможет изменить данные пока поток 2 будет внутри processData() Конкретная реализация, будет зависеть от условия, а оно в моем вопросе было не очень конкретным, хотя вопрос был вполне конкретным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2016, 08:57 |
|
||
|
shared object for signaling purposes
|
|||
|---|---|---|---|
|
#18+
chabapokволтаил не атомарен. O rly? JMM гарантирует, что мы всегда видим консистентное состояние volatile переменной, это ли не атомарность чтения/записи? А в остальном, доля правды в вашем посте есть, возможно ТС на самом деле нужно не то, о чем он спрашивает. Но гадание на эту тему не очень благодарное занятие... rema174хотя вопрос был вполне конкретным. Вполне конкретный ответ - synchronized в продемонстрированном фрагменте кода не нужен, достаточно объявить поле, как volatile. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2016, 10:43 |
|
||
|
shared object for signaling purposes
|
|||
|---|---|---|---|
|
#18+
just_vladimirВполне конкретный ответ - synchronized в продемонстрированном фрагменте кода не нужен, достаточно объявить поле, как volatile. Встречный вопрос, а будет ли выигрыш от замены synchronized на volatile ? На мой взгляд, что в лоб, что по лбу. Скорее всего, код с точки зрения скорости будет одинаковый. Т.ч. пофиг. Или "syhcronized" или "volatile". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2016, 11:47 |
|
||
|
shared object for signaling purposes
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, выигрыш должен быть, по крайней мере в микротестах, лень искать пруфы, думаю где-нибудь в докладах Шипилёва обязательно должно быть, будет свободное время вечером может набросаю JMH бенчмарк. Опять же другое дело на сколько это будет заметно в кейсе автора я могу только догадываться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2016, 12:48 |
|
||
|
shared object for signaling purposes
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevВстречный вопрос, а будет ли выигрыш от замены synchronized на volatile ? На мой взгляд, что в лоб, что по лбу. Скорее всего, код с точки зрения скорости будет одинаковый. Т.ч. пофиг. Или "syhcronized" или "volatile". Вроде бы volatile дешевле полноценного монитора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2016, 13:01 |
|
||
|
shared object for signaling purposes
|
|||
|---|---|---|---|
|
#18+
Если гнаться зе дешевизной, тогда наверное нужно на специальные атомарные классы смотреть: http://winterbe.com/posts/2015/05/22/java8-concurrency-tutorial-atomic-concurrent-map-examples/ https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.html AFAIK они специально для этого и разработаны IMHO Работа volatile менее очевидная, чем synchronized - т.е. можно сделать больше трудноуловимых ошибок. Поэтому я везде synchronized использую, сфера применения volatile лично мне вообще не понятна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2016, 13:18 |
|
||
|
shared object for signaling purposes
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsevбудет ли выигрыш от замены synchronized на volatile ? это как раз про volatile принято говорить expensive, насколько я помню ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2016, 13:28 |
|
||
|
shared object for signaling purposes
|
|||
|---|---|---|---|
|
#18+
rema174Leonid Kudryavtsevбудет ли выигрыш от замены synchronized на volatile ? это как раз про volatile принято говорить expensive, насколько я помню А не припомните, дорого по сравнению с чем? По сравнению с отсутствием любых синхронайзед экшенс или дорого по сравнению с synchronized? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2016, 15:07 |
|
||
|
shared object for signaling purposes
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevЕсли гнаться зе дешевизной, тогда наверное нужно на специальные атомарные классы смотреть: http://winterbe.com/posts/2015/05/22/java8-concurrency-tutorial-atomic-concurrent-map-examples/ https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.html AFAIK они специально для этого и разработаны AFAIK они внутри хранят значение в volatile переменной, так что не очень понятно за счет чего они будут быстрее. А нужны они для того, чтобы уметь выполнять CAS-операции (вроде делают это через unsafe). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2016, 16:56 |
|
||
|
shared object for signaling purposes
|
|||
|---|---|---|---|
|
#18+
just_vladimirAFAIK они внутри хранят значение в volatile переменной, так что не очень понятно за счет чего они будут быстрее. А нужны они для того, чтобы уметь выполнять CAS-операции (вроде делают это через unsafe). Соглашусь. Обычное чтение\запись в Atomic, вроде же имеет семантику volatile. Разница только в наличии CAS операций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2016, 17:00 |
|
||
|
shared object for signaling purposes
|
|||
|---|---|---|---|
|
#18+
Во, вспомнил, где была клевая картинка на эту тему, слайды с докладов Шипилёва (где то вроде даже видео есть), страница 67, http://shipilev.net/talks/jeeconf-May2012-perfMethodology.pdf ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2016, 17:04 |
|
||
|
shared object for signaling purposes
|
|||
|---|---|---|---|
|
#18+
Спасибо, Можно вопрос по презентации? На странице 77 написано: Process/Thread Affinity — taskset/numactl: JVM можно привязать к конкретным CPU — Можно привязать конкретные потоки КАК привязать поток Java к процессору? ((( В свое время было нужно, но были только студенческие .DLL'ки для этого. Стандартного способа не было ((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2016, 17:26 |
|
||
|
shared object for signaling purposes
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevКАК привязать поток Java к процессору? ((( В свое время было нужно, но были только студенческие .DLL'ки для этого. Стандартного способа не было ((( На сколько я знаю, сейчас можно привязать только потоки GC. OpenHFT/Java-Thread-Affinity, вроде вполне взрослое решение, разве нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2016, 17:33 |
|
||
|
shared object for signaling purposes
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, опять же, AFAIK, способа в чистой Java не существует, но для особо упоротых есть JNI, сам не пробовал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2016, 17:33 |
|
||
|
shared object for signaling purposes
|
|||
|---|---|---|---|
|
#18+
BlazkowiczOpenHFT/Java-Thread-Affinity, вроде вполне взрослое решение, разве нет? Не знаю. Поэтому и спросил ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2016, 17:34 |
|
||
|
shared object for signaling purposes
|
|||
|---|---|---|---|
|
#18+
just_vladimirrema174пропущено... это как раз про volatile принято говорить expensive, насколько я помню А не припомните, дорого по сравнению с чем? По сравнению с отсутствием любых синхронайзед экшенс или дорого по сравнению с synchronized? http://stackoverflow.com/a/4634619/4925173 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2016, 17:56 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39218468&tid=2124149]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
143ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 250ms |
| total: | 489ms |

| 0 / 0 |
