powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / shared object for signaling purposes
26 сообщений из 26, показаны все 2 страниц
shared object for signaling purposes
    #39217168
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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;
}

}
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39217315
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174,
Имхо, volatile и без синхронайзед на обоих методах
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39217436
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
just_vladimir,

imho, если пишушщий тред будет устанавливать hasDataToProcess в момент чтения этого значения читающим тредом, то может произойти конфликт. как я понимаю шансы малы, но они есть на такое совпадение, и поэтому там synchronized.
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39217487
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39217494
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
just_vladimir,

авторanother approach
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39217666
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
boolean hasDataToProcess;

поток 1:
synchronized{
установка_данных;
hasDataToProcess =true; 
}

поток 2:
synchronized{ if (hasDataToProcess){ processData(); hasDataToProcess=false; } }



Но это если вам нужна однократная обработка. Если вам многократную, тогда можно volatile, но возникает проблема безопасной публикации из одного потока в другой самих данных. Т.е, если вы сделаете так:

Код: java
1.
2.
3.
4.
5.
6.
7.
volatile boolean hasDataToProcess;

поток 1:
hasDataToProcess =true;

поток 2:
if (hasDataToProcess){ processData();} 



Тут сама по себе проверка - ок, но надо быть готовым к тому, что поток 2 будет внутри processData(), а поток 1 их начнет в это время менять. В потоке 2 внутри вашего processData() часть данных считаются в старых значениях - а часть в новых. Иногда это оно, а иногда это не то, что вы хотите. Все зависит от "обвеса". Так что с этой многопоточностью надо быть очень осторожным.

Есть еще 1 психологический момент - если ты попытался сделать что-то сложное многопоточное, то твой мозг привыкает, что внутри if (условие) это условие может быть false из за действий другого потока. То есть, ты перестаешь быть уверенным буквально во всем. И потом, переключившись на написание однопоточного кода, какое-то время сложно соображать с той же скоростью как ты делал это раньше, потому что твой мозг постоянно тебе подбрасывает тебе идеи в стиле "а вдруг кто-то с другого потока прийдет и нагадит", ну и вообще начинаешь во всем сомневаться.
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39217672
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_vladimirvolatile и без синхронайзед на обоих методах+128



rema174,

Т.к. volatile гарантирует атомарность операции чтения/записи
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39217675
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
chabapokа вы даете человеку который вообще не понимает
ну так и вообще.
я кагбе и применяю по мелочам)
до сих работало.
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39217744
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
chabapok,

развернутый ответ получился, хотя вопрос был куда уже
первый варинант развития событий вполне подходит к условию где только два потока

а что касается второго варината, то что значит многократная обработка?
chabapokнадо быть готовым к тому, что поток 2 будет внутри processData(), а поток 1 их начнет в это время менять. В потоке 2 внутри вашего processData() часть данных считаются в старых значениях - а часть в новых.
можно сделать флаг (volatile?), чтобы поток 1 знал что второй поток "работает", но тоже самое сделает и synchronized, т.о. поток 1 не сможет изменить данные пока поток 2 будет внутри processData()

Конкретная реализация, будет зависеть от условия, а оно в моем вопросе было не очень конкретным, хотя вопрос был вполне конкретным.
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39217858
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokволтаил не атомарен.
O rly? JMM гарантирует, что мы всегда видим консистентное состояние volatile переменной, это ли не атомарность чтения/записи?
А в остальном, доля правды в вашем посте есть, возможно ТС на самом деле нужно не то, о чем он спрашивает. Но гадание на эту тему не очень благодарное занятие...

rema174хотя вопрос был вполне конкретным.
Вполне конкретный ответ - synchronized в продемонстрированном фрагменте кода не нужен, достаточно объявить поле, как volatile.
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39217949
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_vladimirВполне конкретный ответ - synchronized в продемонстрированном фрагменте кода не нужен, достаточно объявить поле, как volatile.
Встречный вопрос, а будет ли выигрыш от замены synchronized на volatile ?

На мой взгляд, что в лоб, что по лбу. Скорее всего, код с точки зрения скорости будет одинаковый. Т.ч. пофиг. Или "syhcronized" или "volatile".
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39218057
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
выигрыш должен быть, по крайней мере в микротестах, лень искать пруфы, думаю где-нибудь в докладах Шипилёва обязательно должно быть, будет свободное время вечером может набросаю JMH бенчмарк.

Опять же другое дело на сколько это будет заметно в кейсе автора я могу только догадываться.
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39218074
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevВстречный вопрос, а будет ли выигрыш от замены synchronized на volatile ?

На мой взгляд, что в лоб, что по лбу. Скорее всего, код с точки зрения скорости будет одинаковый. Т.ч. пофиг. Или "syhcronized" или "volatile".
Вроде бы volatile дешевле полноценного монитора.
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39218094
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 они специально для этого и разработаны

IMHO Работа volatile менее очевидная, чем synchronized - т.е. можно сделать больше трудноуловимых ошибок. Поэтому я везде synchronized использую, сфера применения volatile лично мне вообще не понятна.
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39218104
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsevбудет ли выигрыш от замены synchronized на volatile ?
это как раз про volatile принято говорить expensive, насколько я помню
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39218227
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174Leonid Kudryavtsevбудет ли выигрыш от замены synchronized на volatile ?
это как раз про volatile принято говорить expensive, насколько я помню
А не припомните, дорого по сравнению с чем? По сравнению с отсутствием любых синхронайзед экшенс или дорого по сравнению с synchronized?
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39218418
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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).
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39218423
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_vladimirAFAIK они внутри хранят значение в volatile переменной, так что не очень понятно за счет чего они будут быстрее. А нужны они для того, чтобы уметь выполнять CAS-операции (вроде делают это через unsafe).
Соглашусь. Обычное чтение\запись в Atomic, вроде же имеет семантику volatile. Разница только в наличии CAS операций.
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39218433
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во, вспомнил, где была клевая картинка на эту тему, слайды с докладов Шипилёва (где то вроде даже видео есть), страница 67, http://shipilev.net/talks/jeeconf-May2012-perfMethodology.pdf
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39218458
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо,
Можно вопрос по презентации? На странице 77 написано:
Process/Thread Affinity
— taskset/numactl: JVM можно привязать к конкретным CPU
— Можно привязать конкретные потоки

КАК привязать поток Java к процессору? ((( В свое время было нужно, но были только студенческие .DLL'ки для этого. Стандартного способа не было (((
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39218467
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevКАК привязать поток Java к процессору? ((( В свое время было нужно, но были только студенческие .DLL'ки для этого. Стандартного способа не было (((
На сколько я знаю, сейчас можно привязать только потоки GC.
OpenHFT/Java-Thread-Affinity, вроде вполне взрослое решение, разве нет?
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39218468
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
опять же, AFAIK, способа в чистой Java не существует, но для особо упоротых есть JNI, сам не пробовал.
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39218470
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczOpenHFT/Java-Thread-Affinity, вроде вполне взрослое решение, разве нет?
Не знаю. Поэтому и спросил )))
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39218498
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
just_vladimirrema174пропущено...

это как раз про volatile принято говорить expensive, насколько я помню
А не припомните, дорого по сравнению с чем? По сравнению с отсутствием любых синхронайзед экшенс или дорого по сравнению с synchronized?

http://stackoverflow.com/a/4634619/4925173
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39218501
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174,
не вижу каких либо разногласий того что я писал, с тем что написано по ссылке
...
Рейтинг: 0 / 0
shared object for signaling purposes
    #39218900
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevЕсли гнаться зе дешевизной, тогда наверное нужно на специальные атомарные классы смотреть:

Если IMHO смотреть на цепочку дешевизны, то
volitile<atomic<(synchronize|lock)
Leonid KudryavtsevAFAIK они специально для этого и разработаны
Ну, а волатильные переменные для один поток пишет, другой читает. Собственно ТС так и просил.
Атомик лучше подходит для изменения из нескольких потоков. (Типа счетчик, который увеличивают несколько потоков).
Хотя можно и так.
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / shared object for signaling purposes
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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