|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
Всем привет! С java.util.concurrent.* раньше не сталкивался. Хочется по возможности понять как с ним работать и в каких задач он был бы полезен. Изучение начал с https://habr.com/company/luxoft/blog/157273/ Но мало что оттуда смог понять. Может, пожалуйста, кто подскажет, какие классы из Concurrent Collections используете в работе, почему именно их? В чём выигрыш при использовании java.util.concurrent.* пакета по сравнению с другими "средствами" работы с многопоточностью(типа synchronized). ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2018, 20:56 |
|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
если хочется разобраться то рекомендуемая книга Java Concurrency in Action, да непростая, но закроет почти все вопросы. P/S. Заметил тенденцию - большинство программистов за 30 любят,уважают и почитывают именно книги, хотя не брезгуют и статьями и видео. Когда говорю молодому прочти книгу - вертят нос, и идут на хабр.. Печально это все ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2018, 21:14 |
|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
забыл никесли хочется разобраться то рекомендуемая книга Java Concurrency in Action, да непростая, но закроет почти все вопросы. P/S. Заметил тенденцию - большинство программистов за 30 любят,уважают и почитывают именно книги, хотя не брезгуют и статьями и видео. Когда говорю молодому прочти книгу - вертят нос, и идут на хабр.. Печально это все клевая книга. но чтоб ее понять надо прочесть не раз думаю и попробовать, честно столкнувшись с тем что там говорится. ну хотя б чуть-чуть. да, мне за 30 )) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2018, 22:14 |
|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
mr_virtusМожет, пожалуйста, кто подскажет, какие классы из Concurrent Collections используете в работе, почему именно их? В чём выигрыш при использовании java.util.concurrent.* пакета по сравнению с другими "средствами" работы с многопоточностью(типа synchronized). ощущение что тебя на собеседовании об этом спросили )) в чем выигрыш? да ни в чем. всё, абсолютно всё, что делает инструмент из пакета канкарренси можно повторить на обычных синках вейтах и нотифаях. это просто чуть более высокий уровень абстракции, инкапсулирующий в себе низкоуровневый. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2018, 22:26 |
|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
mr_virtus, https://habr.com/post/116363/ ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2018, 00:14 |
|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
mr_virtusВ чём выигрыш при использовании java.util.concurrent.* пакета по сравнению с другими "средствами" работы с многопоточностью(типа synchronized).в том что код можно разделить на прикладной и системный. Коллекция сущностей отдельно и потоки отдельно. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2018, 07:33 |
|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
Например, MS пошел дальше и ввел не только классы, а и целый оператор await в язык. Чтобы прогеры не ломали голову мелочами когда фоновый поток нужен)) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2018, 07:36 |
|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
andreykaTчуть более высокий уровень абстракции, инкапсулирующий в себе низкоуровневый.да. Отсюда и плюсы минусы ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2018, 07:38 |
|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
andreykaTв чем выигрыш? да ни в чем. всё, абсолютно всё, что делает инструмент из пакета канкарренси можно повторить на обычных синках вейтах и нотифаях. это просто чуть более высокий уровень абстракции, инкапсулирующий в себе низкоуровневый. reduce cognitive complexity? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2018, 13:23 |
|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
andreykaTв чем выигрыш? да ни в чем. всё, абсолютно всё, что делает инструмент из пакета канкарренси можно повторить на обычных синках вейтах и нотифаях. это просто чуть более высокий уровень абстракции, инкапсулирующий в себе низкоуровневый. Вы серьёзно? Почитайте хотя бы java.util.concurrent.ConcurrentHashMap#get и попытайтесь его понять. А потом попробуйты выразить чего через эти ваши вейты и нотифаи. Или хотя бы первый абзац javadoc'а для этого класса почитайте. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2018, 16:26 |
|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
mr_virtusВ чём выигрыш при использовании java.util.concurrent.* пакета по сравнению с другими "средствами" работы с многопоточностью(типа synchronized). сравнение мягкого и теплого например коллекции из java.util.concurrent и synchronized поверх "стандартных" коллекций - __совершенно__ разные алгоритмы Concurrent Collections Besides Queues, this package supplies Collection implementations designed for use in multithreaded contexts: ConcurrentHashMap, ConcurrentSkipListMap, ConcurrentSkipListSet, CopyOnWriteArrayList, and CopyOnWriteArraySet. When many threads are expected to access a given collection, a ConcurrentHashMap is normally preferable to a synchronized HashMap, and a ConcurrentSkipListMap is normally preferable to a synchronized TreeMap. A CopyOnWriteArrayList is preferable to a synchronized ArrayList when the expected number of reads and traversals greatly outnumber the number of updates to a list. .... ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2018, 16:30 |
|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
Alexey TominandreykaTв чем выигрыш? да ни в чем. всё, абсолютно всё, что делает инструмент из пакета канкарренси можно повторить на обычных синках вейтах и нотифаях. это просто чуть более высокий уровень абстракции, инкапсулирующий в себе низкоуровневый. Вы серьёзно? Почитайте хотя бы java.util.concurrent.ConcurrentHashMap#get и попытайтесь его понять. А потом попробуйты выразить чего через эти ваши вейты и нотифаи. Или хотя бы первый абзац javadoc'а для этого класса почитайте. напиши свою реализацию этого инструмента. это просто очередная библиотечка и всё. в то время как всякие синхронайзы вейты нотифаи - это фундаментальные решения платформы. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2018, 18:29 |
|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
Все ЯП - это простые библиотечки и все. В то время, как шестнадцатеричные коды процессора - это фундаментальные решения платформы про всякие синхронайзы вейты и нотифаи - даже говорить не хочется. Напишите свою реализацию этих инструментов. Если, конечно, изучение фундаментальных решений платформы осилите. p.s. Разобраться как работают и написать lock free алгоритмы (аналогичные java.util.concurrent) - блин, это надо быть алгоритмическим гением. С учетом, что даже java.util.concurrent по качеству реализации lock free алгоритмов очень многими критикуется. andreykaTAlexey Tominпропущено... Вы серьёзно? Почитайте хотя бы java.util.concurrent.ConcurrentHashMap#get и попытайтесь его понять. А потом попробуйты выразить чего через эти ваши вейты и нотифаи. Или хотя бы первый абзац javadoc'а для этого класса почитайте. напиши свою реализацию этого инструмента. это просто очередная библиотечка и всё. в то время как всякие синхронайзы вейты нотифаи - это фундаментальные решения платформы. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2018, 18:38 |
|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
я слышал противоположное мнение что локфри проще чем алгоритмы написаные на локах (вейтнотифаяхсинхронайзах). если честно, то хз. мне кажется, что чтоб проблем с многопоточкой не было проще писать код с определенным акцентом. те же мессадж бейсд реализации - это суть многопоточное распределенное решение. и никаких локов там собссно нет. и если появятся - то значит ты чот не то запилил. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2018, 18:53 |
|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
Не очень понимаю, что общего между "мессадж бейсд реализации" и коллекциями Как можно сделать "мессадж бейсд" коллекцию, напрмер Queue ? Можно пример кода ? И, желательно, со сравнением по производительности с ConcurrentLinkedQueue ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2018, 19:08 |
|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
Для чего тебе эта очередь нужна? Вопрос так сказать для понимания задачи в целом. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2018, 21:11 |
|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
Просто коллекция. С очередью придумать сложно, ну пусть будет HashMap в котором для системе чата храним список юзеров которые в чате зарегистрировались. Т.е. при поступлении сообщения от юзера (паралельно обрабатываются в разных обработчиках), например проверяем наличия записи в HashMap (требуется конкуррент доступ) и в зависимости от наличия/отсутвия такого юзера или работаем дальше или говорим пользователю ошибку - вы не зарегистировались в чате. Достоинства использования коллекций из java.concurrent перед synchronized { обычный HashMap } производительность и меньшее кол-во реальных/"машинных" блокировок/коллизий 1) В случае synchronized или "мессадж бейсд" - у нас доступ к коллекции всегда осуществляется __единственным__ работающим потоком/CPU, остальные ждут. Или ждут на synchronized, или, при "мессадж бейсд", пока разгребатель мессаджей (актор) не освободится Плюс, при "мессадж бейсд", потеря перформанса/latency на самих мессаджах должна просто зашкаливать. В общем, совершенно не нужный и лишний overhead при наличие стандартного пакета/классов обеспечивающих нужный функционал. 2) В случае конкурентных реализаций HashMap, если на верхнем уровне HashMap партиционирован, то в оптимальном случае, доступ к коллекции/данным осуществляется сразу несколькими потоками/CPU, истинно параллельно. Поэтому они и concurrent collection. Алгоритмы "обычных" коллекций и concurrent коллекций - совершенно разные. p.s. точных детали реализации concurrent коллекций из данного пакета в java - не помню (про HashMap). Плюс стандартные java'вские реализации часто неэффективны. Но всегда можно заюзать сторонние коллекции с нужными алгоритмами/характеристиками. IMHO & AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2018, 16:10 |
|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
andreykaTAlexey Tominпропущено... Вы серьёзно? Почитайте хотя бы java.util.concurrent.ConcurrentHashMap#get и попытайтесь его понять. А потом попробуйты выразить чего через эти ваши вейты и нотифаи. Или хотя бы первый абзац javadoc'а для этого класса почитайте. напиши свою реализацию этого инструмента. это просто очередная библиотечка и всё. в то время как всякие синхронайзы вейты нотифаи - это фундаментальные решения платформы. В то-то и дело, что этот пакет почти не использует ничего из стандартного, обходясь без блокировок. Это, в некоторых случаях, даёт очень большой прирост производительности. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2018, 16:10 |
|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
он использует нативные вызовы.. вот и всё.. ты их тоже можешь использовать :) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2018, 17:25 |
|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
andreykaTон использует нативные вызовы.. вот и всё.. ты их тоже можешь использовать :) Любой может использовать Theta* для нахождения кратчайшего пути, но почему то большинство тупо используют перебор, ага. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2018, 17:29 |
|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevПросто коллекция. С очередью придумать сложно, ну пусть будет HashMap в котором для системе чата храним список юзеров которые в чате зарегистрировались. Т.е. при поступлении сообщения от юзера (паралельно обрабатываются в разных обработчиках), например проверяем наличия записи в HashMap (требуется конкуррент доступ) и в зависимости от наличия/отсутвия такого юзера или работаем дальше или говорим пользователю ошибку - вы не зарегистировались в чате. Достоинства использования коллекций из java.concurrent перед synchronized { обычный HashMap } производительность и меньшее кол-во реальных/"машинных" блокировок/коллизий 1) В случае synchronized или "мессадж бейсд" - у нас доступ к коллекции всегда осуществляется __единственным__ работающим потоком/CPU, остальные ждут. Или ждут на synchronized, или, при "мессадж бейсд", пока разгребатель мессаджей (актор) не освободится Плюс, при "мессадж бейсд", потеря перформанса/latency на самих мессаджах должна просто зашкаливать. В общем, совершенно не нужный и лишний overhead при наличие стандартного пакета/классов обеспечивающих нужный функционал. 2) В случае конкурентных реализаций HashMap, если на верхнем уровне HashMap партиционирован, то в оптимальном случае, доступ к коллекции/данным осуществляется сразу несколькими потоками/CPU, истинно параллельно. Поэтому они и concurrent collection. Алгоритмы "обычных" коллекций и concurrent коллекций - совершенно разные. p.s. точных детали реализации concurrent коллекций из данного пакета в java - не помню (про HashMap). Плюс стандартные java'вские реализации часто неэффективны. Но всегда можно заюзать сторонние коллекции с нужными алгоритмами/характеристиками. IMHO & AFAIK чот вы не то говорите )) причем тут синхронайз и мессаджбейсд? никаких синхронайзов вообще. у нас есть продусеры есть консумеры. если продусеров много а консумеров мало добавляем консумеров. и дальше сколь угодно далеко пока то что исполняет роль брокера не помрет. а когда помрет мы и его добавим. зачем работать с мутабельными объектами вообще? конечно шаред мутабл обжект так или иначе вы будете и обязаны и должны каким-то образом использовать такими вот "конкурентными" инструментами. а если у нас их вообще нет? то и инструменты не нужны. насчет разноса когда на микроблоки и общение через посредника - да, это будет оверхед. но это временно.. ну сколько у вас там потоков параллельно ваша жвм вытянет? сильно больше чем количество ядер? нет. а представьте у вас чатик, где не 100 юзеров или 1000 или 10 000, а 10 миллионов? что вы там со своими коллекциями несчастными будете делать? да ничего. я ничего против канкарренси не имею, но всё же мне кажется, что это всё еще достаточно низкий уровень абстракции, чтоб им бездумно затыкать все дыры перформанса. ну и да.. юзать мутабельные объекты плохо, расшаренные объекты промеж потоков тоже плохо. и имхо, это надо делать только тогда, когда иначе уже совсем уж никак. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2018, 22:27 |
|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
andreykaTконсумеров мало добавляем консумеров И как РАЗНЫЕ консумеры будут из ОДНОЙ коллекции результат возврашать? Какой тип коллекции будете использовать, если консумеров много? Код пожалуйста. Есть обработчик Web-запросов, нужна ОБЩИЙ HashMap со списком текущих пользователей. Web-запрос просто проверяет наличие user'а в HashMap и возврашает Ok или Error (нет такого пользователя) Какой использовать тип коллекции? Как это будет выглядить в Вашем случае "ивент басед"? Можно, конечно, самому делать шардинг (разные консумеры с шарднутыми очередями + протокол синхронизации + протокол единого интератора + черти что еще), но зачем? Когда есть полно стандартных реализаций concurent HashMap. Мало того, сама очередь сообщений между продюсерами и консумерами, скорее всего, будет сделана на java.concurent.LinkedQueue. Т.е. получается масло-масленное. Дабы не использовать java.concurrent будем городить "евент басд" велосипед, который все равно через java.concurent.LinkedQueue работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2018, 15:25 |
|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, да вроде ringbuffer - старье. Вон, лет 5 как был хайп по дисраптору - все через проитивные (читай - волатильные) типы сделано - фиксированный буфер, у продюсеров и консьюмеров только счетчики.. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2018, 15:54 |
|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevandreykaTконсумеров мало добавляем консумеров И как РАЗНЫЕ консумеры будут из ОДНОЙ коллекции результат возврашать? Какой тип коллекции будете использовать, если консумеров много? Код пожалуйста. Есть обработчик Web-запросов, нужна ОБЩИЙ HashMap со списком текущих пользователей. Web-запрос просто проверяет наличие user'а в HashMap и возврашает Ok или Error (нет такого пользователя) Какой использовать тип коллекции? Как это будет выглядить в Вашем случае "ивент басед"? Можно, конечно, самому делать шардинг (разные консумеры с шарднутыми очередями + протокол синхронизации + протокол единого интератора + черти что еще), но зачем? Когда есть полно стандартных реализаций concurent HashMap. Мало того, сама очередь сообщений между продюсерами и консумерами, скорее всего, будет сделана на java.concurent.LinkedQueue. Т.е. получается масло-масленное. Дабы не использовать java.concurrent будем городить "евент басд" велосипед, который все равно через java.concurent.LinkedQueue работает. если у вас стоит скажем лоадбалансёр и некоторое количество инстансов, обрабатывающих хттп запросы в какой хашмапе вы это всё собрались хранить? :) будете хранить в хашмапе первого инстанса - второй об этом будет ни сном ни духом. и наоборот. а если у вас этих инстансов с десяток крутится? ответ прост - никакой хашмап я не буду использовать ибо это невозможно. я заюзаю редиса. и буду использовать редис в качестве мапы для хранения КВ данных и все инстансы будут бежать туда чтоб посмотреть кто из юзеров залогинен а кто нет. будет мало производительности одного редиса - добавлю еще один. и так до бесконечности. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2018, 16:25 |
|
java.util.concurrent.*, concurrent collections
|
|||
---|---|---|---|
#18+
Озверинда вроде ringbuffer - старье Так Circle Ring Buffer и есть один из основных/простейших concurrent lock free алгоритмов. Точнее даже вообще wait free (некоторые реализации). Озверинвсе через проитивные (читай - волатильные) типы сделано Ну дык concurrent коллекции так и делают. Вот эти алгортимы как раз в java.concurrent и сделаны Об том и речь. Что java.concurrent (в основном) это СОВЕРШЕННО другие алгоритмы, чем "обычные" коллекции + synchronized Весь флейм с высказывания "инструмент из пакета канкарренси можно повторить на обычных синках вейтах и нотифаях" и начался. Т.к. коллекции другие и алгоритмы совершенно другие. Озверин у продюсеров и консьюмеров только счетчики Фразу "только счетчики" не понял У всех алгоритмов, "только ячейки в памяти". Другое дело, как коллизии разрешать. Когда несколько разных потоков (CPU) к одной "ячейки в памяти" (счетчику) получить доступ хотят. Можно через synchronized, можно через различные lock free алгоритмы (отслеживать коллизии и разбираться с результатом коллизий) Ну а дальше, еще этот lock free алгоритм корректно закодироваь. Выравние по строкам кэша и прочее ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2018, 16:29 |
|
|
start [/forum/topic.php?fid=59&msg=39726113&tid=2121682]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
52ms |
get topic data: |
8ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 163ms |
0 / 0 |