|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
Это один из вопросов который может прилететь на собесах. Сначала спросят про обеспечение уникальности счетчика (или PK) в рамках одного JavaProcess. Если у нас есть распределённая система (10 cluster nodes) и для всех них нужен некий генератор уникальности (в рамках Integer или Long или String) то атомик становится не особо полезен. Тоесть он конешно полезен но накладные расходы будут не в самом атомике а вообще в архитектуре сети. Тут можно делать генерацию на базе UUID или просто побив диапазон целых например по известной формуле. На прошлом проекте я придумывал динамическое разбиение диапазона Long при условии что изначально число узлов - неизвестною. Но каждый из потребителей не должен испытвать проблем с номерной ёмкостью ключей. Это к сожалению не зашло в прод. Но идея у меня осталась. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2021, 19:21 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
atomic и сделаны через volatile. Можно исходный код погуглить. То, что "классы разные нужны, классы многие важны" - никто и не спорит возьмут волатайл по вашему совету у меня где-то был такой совет? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2021, 19:25 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
ну уникальные ID-шники это такое... Например в CC&B ID-шники генерировались как случайные числа. Долго изумлялся, потом прочитал, что это чуть ли не стандарт в написании высоконагруженных приложений для СУБД ))). А сиквенсы - вообще отстой и торзмоз ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2021, 19:30 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
[censored] Смысл моего поста был, что через volatile МОЖНО написать ЛЮБОЕ многопоточное приложение. Т.к. даже блокировки (synchronize, lock) тоже через них делаются. Т.е. избыточны, в моем понимании данного слова. Но избыточны и можно НЕ РАВНО [censored] "удобно", "отлично подходит", "предлагал". ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2021, 19:33 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
Ну и да... ждем обещанной задачи от знатоков многопоточки ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2021, 19:35 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Ну и да... ждем обещанной задачи от знатоков многопоточки Ну вообще-то volatile никак не может заменить atomic. Volatile переменная в сорцах отвечает только за корректность метода get, т.е чтение. Модификация же заимплеменчена через Unsafe, который в свою очередь использует нативные инструкции процессора - CAS(compare and swap). Ну и собственно любая задача, где нужно обновить переменную, учитывая ее значение не может быть реализована на одном volatile. Стас конечно редко дело говорит, но в данном случае он ближе к правде ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2021, 20:57 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
Ни JVM не JLS не регламентируют как должен быть реализован Atomic. Это всё - особенности железа и native библиотек Java. На JVM/Intel - это может быть Atomic -> Unsafe -> CAS, на каком-нибудь JVM/Эльбрус-Байкал это может быть что-то другое Atomic -> .... e.t.c. И непонятно чего мы спорим. Стек атомика реализован опытными людьми, которые прошли много редактуры кода JVM. Там - каждая строка - выстрадана и вылизана до предела. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2021, 22:23 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
Zzz79 пс. Леня ты собсвенно прежде ответа - изучи матчасть Проблема в том, что организация многопоточности только через volatile - очень неэффективна. Тратить процессорное время, в основном, на ожидание захвата очередного семафора - так себе вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2021, 22:55 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
Zzz79, >вот сейчас я пилю сервис = этот топик курилка что ли? Кончай подымать топики по надцать страниц. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2021, 07:23 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
mayton И непонятно чего мы спорим. Стек атомика реализован опытными людьми, которые прошли много редактуры кода JVM. Там - каждая строка - выстрадана и вылизана до предела. Одно время читал livejournal человека который учился и серьезно разбирался в многопоточке. Там все сильно плохо ))) сказать что "каждая строка выстрадана и вылизана до предела" это сильно большое приувеличение. На стандартные библиотеки от Java __очень__ много критики и достаточно много альтернативных реализаций. Те же самые Atomic'и появились не так уж и давно (по меркам Java). До этого их просто не было. Фактически единственный "многопоток" который был в Java более-менее изначально ConcurrentLinkedQueue. Да и тот ругали, что используемый там алгоритм приводить к memory leak'у. Но когда я пытался повторить test case, у меня повторить не получилось, возможно на тот момент уже подправили или я чего-то недопонял (возможно проблема затрагивает только minor сборщик мусора). AFAIK Например Sun/Oracle авторы Java библиотек на коллизии при доступе к данным в одной строке кеша - клали и, как я подозреваю, продолжают класть с высокой колокольни. Возможно в Open JDK что-то изменилось. Но не факт. Не знаю. Набор конкарент коллекций так же достаточно убогий. Или просто blocking обертка поверх стандартных коллекций или раз-два и все. Например отсутвуют нормальные многопотоковые bounded коллекции. Хотя для любого более-менее нормального сервиса/сервира, проверка на переполнение очереди сообщение как-то ну крайне желательна. Т.е. ConcurrentLinkedQueue для очереди сообщений - ну сильно не оптимальный выбор, а другого в стандартных библиотеках вроде то и нет. В результате нарываешься на костыли и велосипеды, где классы используются совершенно НЕ по их назначению. Например берут ConcurrentLinkedQueue и поверх навешивают 100500 счетчиков на AtomicInteger, что бы банальный size коллекции считать и проверять (видел такое в реальных проектах). А то что получается в итоге, еще и эффективным многопотоком обзывают ))) хотя это не многопоток, а помойка из отбросов ))). ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2021, 15:50 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev [censored] Смысл моего поста был, что через volatile МОЖНО написать ЛЮБОЕ многопоточное приложение. ИМХО довольно спорное утверждение. Как к примеру чисто на волатайлах сделать простой лок? Можно пример кода? - пусть даже не эффективного ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2021, 15:59 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
SpringMan Leonid Kudryavtsev [censored] Смысл моего поста был, что через volatile МОЖНО написать ЛЮБОЕ многопоточное приложение. ИМХО довольно спорное утверждение. Как к примеру чисто на волатайлах сделать простой лок? Можно пример кода? - пусть даже не эффективного Циклы крутить. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2021, 16:32 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Те же самые Atomic'и появились не так уж и давно (по меркам Java) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2021, 16:37 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
mayton SpringMan пропущено... ИМХО довольно спорное утверждение. Как к примеру чисто на волатайлах сделать простой лок? Можно пример кода? - пусть даже не эффективного Циклы крутить. Ну у меня есть предположение, в каком виде вы хотите его написать) Но я сомневаюсь, что в таком виде он будет правильно работать. Поэтому и прошу пример кода - мало ли я что-то не так понимаю ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2021, 16:37 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
ну как минимум: 1. никто не мешает сделать поток-диспетчер, который всегда выполняется и отслеживает блокировок/атомарных операций поскольку к этим структурам доступ есть только у него, продлемы с многопотоком нет 2. в пользовательских потоках: посылаем в него сообщение, встаем в цикл, ждем ответа Для передачи сообщений для каждого пользовательского/управляемого-потока, заводим банально по переменной. Если она пустая - пред. сообщение потоком-диспетчером обработалось, пишем сообщение в данную переменную. Если не пустая - стоим/ждем переменная используется в качестве вырожденного Single Producer - Single Consumer Queue на одно сообщение. В потоке-диспетчере пробегаем в цикле все очереди. IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2021, 16:54 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Набор конкарент коллекций так же достаточно убогий. Или просто blocking обертка поверх стандартных коллекций или раз-два и все. Например отсутвуют нормальные многопотоковые bounded коллекции. Хотя для любого более-менее нормального сервиса/сервира, проверка на переполнение очереди сообщение как-то ну крайне желательна. Т.е. ConcurrentLinkedQueue для очереди сообщений - ну сильно не оптимальный выбор, а другого в стандартных библиотеках вроде то и нет. Ограничен в размерах? Да. Можно проверить размер конкретной очереди? Да. Можно проверить количество доступных слотов? Да. Можно "на авось" подождать (заданное время) при помещении элемента в переполненную очередь? Да, хотя это - сомнительное решение. Требуются сложные дисциплины обслуживания? Да, придётся ручками. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2021, 16:59 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
Basil A. Sidorov ...типа, вчера??? был не прав. Атомики и ConcurrentLinkedQueue одновременно появились. Мне почему-то казалось, что это более позднее дополнение. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2021, 17:02 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
Оно изначально было в пакете Doug Lea EDU.oswedu.чего-то.там.util.concurent. Я запомнил, поскольку у нас был сервис на 1.4.2, где использовался именно этот пакет. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2021, 17:14 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
Basil A. Sidorov Doug Lea У меня такое чувство, что это чуть ли не единственный человек, который занимался этими пакетами. Он точно читает лекции и ведет курсы, где учит многопоточке. В том числе, lock free алгоритмам начиная с Circle Ring Buffer. Почему он пропихнул именно и исключительно ConcurrentLinkedQueue в стандартные библиотеки, то ведомо только ему ))) возможно просто в тот момент ему именно данный lock free алгоритм был интересен. В общем, планомерной работы по конкаррент ( lock free, wait free ) коллекциям - не заметно. Одни случайные классы/алгоритмы (как уже выяснилось по данной дискуссии "полезные" ))) ) добавили, другие, не менее, а возможно и более полезные и классические алгоритмы - нет. ConcurrentLinkedQueue есть, а более простой и производительный Circle Ring Buffer нет. AFAIK "Нормальные библиотеки" ( TM ) сразу же включают в себя целую кучу алгоритмов: SingleProducerSingleConsumer MultiProducerSingleConsumer SingleProducerMultiConsumer MultiProducerMultiConsumer.... Bounded / unbounded и так далее..... А Doug Lea из всей кучи выдернул одинокий ConcurrentLinkedQueue и включил его в стандартные либы. И по факту везде в проектах ConcurrentLinkedQueue и к месту и не к месту. Дабы других lock free и не дали. В целом стандартная Java Lib в очень многих местах выглядит как дикая помойка. Например 100500 разных классов для работы с датами. Не говоря уже о том, что в одних стандартных классах месяц нумеруется с 0, в других месяцы нумеруются с 1. Историческая помойка. Когда понадобилась более-менее нормальная работа с датами, пришлось взять JodaTime Когда понадобились более-менее нормальные коллекции (производительность, потребление памяти) - опять таки пришлось брать сторонние либы. Т.ч. многопоточка не исключение ))) IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2021, 18:09 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
Вот этот блог мне очень понравился. Очень интересные посты. Он учился у Doug Lea и писал/оптимизировал свой lock free коллекцию. В общем, как человек степ бай степ успешно учился многопоточки и оптимизации. Поскольку степ бай степ - то даже мне местами было понятно ))) http://psy-lob-saw.blogspot.com Я так понимаю, он сейчас один из авторов org.jctools https://github.com/JCTools/JCTools Применительно собственно к теме топика (новые версии Java). Интересный факт, что изменение garbage collection на новый lock free алгоритмы запортило ))) http://psy-lob-saw.blogspot.com/2018/01/what-difference-jvm-makes.html Oracle8u144: pollsMade | 361.161 ± 4.126 ops/us Oracle9.0.1: pollsMade | 26.182 ± 2.273 ops/us изучаешь изучаешь lock free алгоритмы, а тут приходит новый garbage collector и сам всюду блокировки раставляет ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2021, 19:19 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev ну как минимум: 1. никто не мешает сделать поток-диспетчер, который всегда выполняется и отслеживает блокировок/атомарных операций поскольку к этим структурам доступ есть только у него, продлемы с многопотоком нет 2. в пользовательских потоках: посылаем в него сообщение, встаем в цикл, ждем ответа Для передачи сообщений для каждого пользовательского/управляемого-потока, заводим банально по переменной. Если она пустая - пред. сообщение потоком-диспетчером обработалось, пишем сообщение в данную переменную. Если не пустая - стоим/ждем переменная используется в качестве вырожденного Single Producer - Single Consumer Queue на одно сообщение. В потоке-диспетчере пробегаем в цикле все очереди. IMHO Ну я ожидал без диспетчера, но это походу мои проблемы) А так да, как решение похоже подходит ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2021, 17:05 |
|
|
start [/forum/topic.php?fid=59&gotonew=1&tid=2120495]: |
0ms |
get settings: |
20ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
9ms |
get first new msg: |
12ms |
get forum data: |
2ms |
get page messages: |
580ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 688ms |
0 / 0 |