powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Java 8 - уже не совсем Java?
23 сообщений из 448, страница 18 из 18
Java 8 - уже не совсем Java?
    #40048232
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это один из вопросов который может прилететь на собесах. Сначала спросят про обеспечение уникальности
счетчика (или PK) в рамках одного JavaProcess.

Если у нас есть распределённая система (10 cluster nodes) и для всех них нужен некий генератор уникальности
(в рамках Integer или Long или String) то атомик становится не особо полезен. Тоесть он конешно полезен но накладные
расходы будут не в самом атомике а вообще в архитектуре сети. Тут можно делать генерацию на базе UUID или
просто побив диапазон целых например по известной формуле.

На прошлом проекте я придумывал динамическое разбиение диапазона Long при условии что изначально число
узлов - неизвестною. Но каждый из потребителей не должен испытвать проблем с номерной ёмкостью ключей.

Это к сожалению не зашло в прод. Но идея у меня осталась.
...
Рейтинг: 0 / 0
Java 8 - уже не совсем Java?
    #40048233
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
atomic и сделаны через volatile. Можно исходный код погуглить.

То, что "классы разные нужны, классы многие важны" - никто и не спорит

возьмут волатайл по вашему совету
у меня где-то был такой совет?
...
Рейтинг: 0 / 0
Java 8 - уже не совсем Java?
    #40048234
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну уникальные ID-шники это такое...

Например в CC&B ID-шники генерировались как случайные числа. Долго изумлялся, потом прочитал, что это чуть ли не стандарт в написании высоконагруженных приложений для СУБД ))). А сиквенсы - вообще отстой и торзмоз )))
...
Рейтинг: 0 / 0
Java 8 - уже не совсем Java?
    #40048236
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[censored]

Смысл моего поста был, что через volatile МОЖНО написать ЛЮБОЕ многопоточное приложение. Т.к. даже блокировки (synchronize, lock) тоже через них делаются. Т.е. избыточны, в моем понимании данного слова.

Но избыточны и можно НЕ РАВНО [censored] "удобно", "отлично подходит", "предлагал".
...
Рейтинг: 0 / 0
Java 8 - уже не совсем Java?
    #40048237
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и да... ждем обещанной задачи от знатоков многопоточки
...
Рейтинг: 0 / 0
Java 8 - уже не совсем Java?
    #40048245
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Ну и да... ждем обещанной задачи от знатоков многопоточки

Ну вообще-то volatile никак не может заменить atomic. Volatile переменная в сорцах отвечает только за корректность метода get, т.е чтение. Модификация же заимплеменчена через Unsafe, который в свою очередь использует нативные инструкции процессора - CAS(compare and swap). Ну и собственно любая задача, где нужно обновить переменную, учитывая ее значение не может быть реализована на одном volatile. Стас конечно редко дело говорит, но в данном случае он ближе к правде
...
Рейтинг: 0 / 0
Java 8 - уже не совсем Java?
    #40048256
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ни JVM не JLS не регламентируют как должен быть реализован Atomic. Это всё - особенности железа и native
библиотек Java. На JVM/Intel - это может быть Atomic -> Unsafe -> CAS, на каком-нибудь JVM/Эльбрус-Байкал это может быть
что-то другое Atomic -> .... e.t.c.

И непонятно чего мы спорим. Стек атомика реализован опытными людьми, которые прошли много редактуры
кода JVM. Там - каждая строка - выстрадана и вылизана до предела.
...
Рейтинг: 0 / 0
Java 8 - уже не совсем Java?
    #40048259
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zzz79
пс. Леня ты собсвенно прежде ответа - изучи матчасть
Он прав в том, что volatile достаточен для синхронизации многопоточных вычислений.
Проблема в том, что организация многопоточности только через volatile - очень неэффективна. Тратить процессорное время, в основном, на ожидание захвата очередного семафора - так себе вариант.
...
Рейтинг: 0 / 0
Java 8 - уже не совсем Java?
    #40048275
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zzz79,
>вот сейчас я пилю сервис
= этот топик курилка что ли?
Кончай подымать топики по надцать страниц.
...
Рейтинг: 0 / 0
Java 8 - уже не совсем Java?
    #40048318
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
----
...
Рейтинг: 0 / 0
Java 8 - уже не совсем Java?
    #40048443
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 коллекции считать и проверять (видел такое в реальных проектах). А то что получается в итоге, еще и эффективным многопотоком обзывают ))) хотя это не многопоток, а помойка из отбросов ))).
...
Рейтинг: 0 / 0
Java 8 - уже не совсем Java?
    #40048449
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev
[censored]
Смысл моего поста был, что через volatile МОЖНО написать ЛЮБОЕ многопоточное приложение.

ИМХО довольно спорное утверждение. Как к примеру чисто на волатайлах сделать простой лок? Можно пример кода? - пусть даже не эффективного
...
Рейтинг: 0 / 0
Java 8 - уже не совсем Java?
    #40048463
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SpringMan
Leonid Kudryavtsev
[censored]
Смысл моего поста был, что через volatile МОЖНО написать ЛЮБОЕ многопоточное приложение.

ИМХО довольно спорное утверждение. Как к примеру чисто на волатайлах сделать простой лок? Можно пример кода? - пусть даже не эффективного

Циклы крутить.
...
Рейтинг: 0 / 0
Java 8 - уже не совсем Java?
    #40048464
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Те же самые Atomic'и появились не так уж и давно (по меркам Java)
1.5 и backport в 1.4.2 это, типа, вчера???
...
Рейтинг: 0 / 0
Java 8 - уже не совсем Java?
    #40048466
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
SpringMan
пропущено...

ИМХО довольно спорное утверждение. Как к примеру чисто на волатайлах сделать простой лок? Можно пример кода? - пусть даже не эффективного

Циклы крутить.

Ну у меня есть предположение, в каком виде вы хотите его написать) Но я сомневаюсь, что в таком виде он будет правильно работать. Поэтому и прошу пример кода - мало ли я что-то не так понимаю
...
Рейтинг: 0 / 0
Java 8 - уже не совсем Java?
    #40048473
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну как минимум:
1. никто не мешает сделать поток-диспетчер, который всегда выполняется и отслеживает блокировок/атомарных операций
поскольку к этим структурам доступ есть только у него, продлемы с многопотоком нет
2. в пользовательских потоках: посылаем в него сообщение, встаем в цикл, ждем ответа

Для передачи сообщений для каждого пользовательского/управляемого-потока, заводим банально по переменной. Если она пустая - пред. сообщение потоком-диспетчером обработалось, пишем сообщение в данную переменную. Если не пустая - стоим/ждем

переменная используется в качестве вырожденного Single Producer - Single Consumer Queue на одно сообщение. В потоке-диспетчере пробегаем в цикле все очереди.

IMHO
...
Рейтинг: 0 / 0
Java 8 - уже не совсем Java?
    #40048475
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Набор конкарент коллекций так же достаточно убогий. Или просто blocking обертка поверх стандартных коллекций или раз-два и все. Например отсутвуют нормальные многопотоковые bounded коллекции.

Хотя для любого более-менее нормального сервиса/сервира, проверка на переполнение очереди сообщение как-то ну крайне желательна. Т.е. ConcurrentLinkedQueue для очереди сообщений - ну сильно не оптимальный выбор, а другого в стандартных библиотеках вроде то и нет.
ArrayBlockingQueue вам чем не угодил?
Ограничен в размерах? Да.
Можно проверить размер конкретной очереди? Да.
Можно проверить количество доступных слотов? Да.
Можно "на авось" подождать (заданное время) при помещении элемента в переполненную очередь? Да, хотя это - сомнительное решение.
Требуются сложные дисциплины обслуживания? Да, придётся ручками.
...
Рейтинг: 0 / 0
Java 8 - уже не совсем Java?
    #40048479
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
...типа, вчера???

был не прав.
Атомики и ConcurrentLinkedQueue одновременно появились. Мне почему-то казалось, что это более позднее дополнение.
...
Рейтинг: 0 / 0
Java 8 - уже не совсем Java?
    #40048483
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оно изначально было в пакете Doug Lea EDU.oswedu.чего-то.там.util.concurent.
Я запомнил, поскольку у нас был сервис на 1.4.2, где использовался именно этот пакет.
...
Рейтинг: 0 / 0
Java 8 - уже не совсем Java?
    #40048514
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Java 8 - уже не совсем Java?
    #40048536
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот этот блог мне очень понравился. Очень интересные посты. Он учился у 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 и сам всюду блокировки раставляет )))
...
Рейтинг: 0 / 0
Java 8 - уже не совсем Java?
    #40049059
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev
ну как минимум:
1. никто не мешает сделать поток-диспетчер, который всегда выполняется и отслеживает блокировок/атомарных операций
поскольку к этим структурам доступ есть только у него, продлемы с многопотоком нет
2. в пользовательских потоках: посылаем в него сообщение, встаем в цикл, ждем ответа

Для передачи сообщений для каждого пользовательского/управляемого-потока, заводим банально по переменной. Если она пустая - пред. сообщение потоком-диспетчером обработалось, пишем сообщение в данную переменную. Если не пустая - стоим/ждем

переменная используется в качестве вырожденного Single Producer - Single Consumer Queue на одно сообщение. В потоке-диспетчере пробегаем в цикле все очереди.
IMHO


Ну я ожидал без диспетчера, но это походу мои проблемы) А так да, как решение похоже подходит
...
Рейтинг: 0 / 0
Java 8 - уже не совсем Java?
    #40058609
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Релизнулась 16 версия. И хотя это еще не LTS. Предлагаю обсудить че так и как.
...
Рейтинг: 0 / 0
23 сообщений из 448, страница 18 из 18
Форумы / Java [игнор отключен] [закрыт для гостей] / Java 8 - уже не совсем Java?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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