Size: a a a

2020 August 27

II

Iurii Iurchenko in JUG NN
если да, то putIfAbsent не покатит
источник

SK

Sergey Kapralov in JUG NN
Iurii Iurchenko
я на 100% за ConcurrentHashMap не уверен если что. может там и есть такая гарантия. ну в любом случае - она тебе нужна?
Если я следую путем https://gist.github.com/skapral/1ff7157647e36aefe4d67c76ec70581b, то нет, не нужна. Но вопрос тогда сводится к тому, не накосячил ли я в memoizedCalculation.
источник

II

Iurii Iurchenko in JUG NN
на мой взгляд код выглядит корректно. пара соображений:
1. у тебя лок очень глобальный + момент наступления непредсказуем + calculation видимо долгий - можно подумать о ReentrantLock - tryLock в качестве защиты от дедлока из серии кэш + какой-то ещё глобальный ресурс на который при старте все кинутся лочиться
2. если у тебя на старте делается много гетов из разных потоков, типо прогрева и calculation у всех долгий, то время старта может растянуться, т.к. вызовы calculation для всех ключей выстроятся в одну цепочку по сути. можно Striped лок воткнуть для увеличения параллелизма - https://guava.dev/releases/19.0/api/docs/com/google/common/util/concurrent/Striped.html. но тогда ты конечно с такими лямбдами можешь воткнуться в дедлок уже на работе чисто с кэшем. опять же tryLock в помощь
источник

SK

Sergey Kapralov in JUG NN
Iurii Iurchenko
на мой взгляд код выглядит корректно. пара соображений:
1. у тебя лок очень глобальный + момент наступления непредсказуем + calculation видимо долгий - можно подумать о ReentrantLock - tryLock в качестве защиты от дедлока из серии кэш + какой-то ещё глобальный ресурс на который при старте все кинутся лочиться
2. если у тебя на старте делается много гетов из разных потоков, типо прогрева и calculation у всех долгий, то время старта может растянуться, т.к. вызовы calculation для всех ключей выстроятся в одну цепочку по сути. можно Striped лок воткнуть для увеличения параллелизма - https://guava.dev/releases/19.0/api/docs/com/google/common/util/concurrent/Striped.html. но тогда ты конечно с такими лямбдами можешь воткнуться в дедлок уже на работе чисто с кэшем. опять же tryLock в помощь
> 1. у тебя лок очень глобальный + момент наступления непредсказуем + calculation видимо долгий - можно подумать о ReentrantLock - tryLock в качестве защиты от дедлока из серии кэш + какой-то ещё глобальный ресурс на который при старте все кинутся лочиться

О, этот момент мне самому не нравится. Но пока чет не придумалось чем его заменить.

> 2. если у тебя на старте делается много гетов из разных потоков, типо прогрева и calculation у всех долгий, то время старта может растянуться

Не, намеренно на старте оно не прогревается. Но да, я еще когда описывал эти гисты, заметил что синхронайзд на кеше — не выход.
источник

SK

Sergey Kapralov in JUG NN
В @jvmchat предложили вариант через кэш фючей. Выглядит как неплохая идея
источник

SK

Sergey Kapralov in JUG NN
Переслано от Dmitry Baynak
пришла задача по ключу в какой-то тред - тред через computeIfAbsent на CHM либо создает CompletableFuture, либо получает уже известную, дальше await'ит результата
если нужно дождаться что-то другое, аналогично - или через computeIfAbsent создаем, или получаем уже созданный инстанс CompletableFuture (или как вычисляющийся, или как уже вычислившийся) и await'имся на ней (или на них, если А1 и А2)
CompletableFuture для 1 ключа существует всегда одно, эта штука хранит и значение после вычисления
источник

SK

Sergey Kapralov in JUG NN
Переслано от Sergey Kapralov
Поинвестигировал солюшен через фючи в мапе, выглядит перспективно. Единственное что, в моем случае я б не хотел приплетать дополнительно к существующим тредам еще и FJP + мне бы хотелось чтоб один вызов хевилифтинга исполнялся одним тредом от начала и до конца. И поэтому заменил CompletableFuture на FutureTaskи. Получилось следующее:

java
class Util {
   public static <T> T memoizedCalculation(ConcurrentHashMap<Key, FutureTask<T>> cache, Key key, Callable<T> calculation) {
       try {
           FutureTask<T> t = cache.computeIfAbsent(key, k -> new FutureTask<>(calculation));
           t.run();
           return t.get();
       } catch(Exception ex) {
           throw new RuntimeException(ex);
       }
   }
}

Как такой вариант?
источник
2020 August 28

SK

Sergey Kapralov in JUG NN
Переслано от Sergey Kapralov
https://pikabu.ru/story/ponyatlivyiy_oleg_7663449
:)))))))))))))))))))))))))))))))))))))))))
источник

MM

Maksim Maslov in JUG NN
источник

MM

Maksim Maslov in JUG NN
ну, хоть не стек трейс зачитал. Уже победа
источник

RK

Roman Khlebnov in JUG NN
Надо оттуда вырезать вздох Олега
источник

RK

Roman Khlebnov in JUG NN
Столько для него подходящих ситуаций... Можно его как звук нотификашки об упавшем билде поставить, например
источник

SK

Sergey Kapralov in JUG NN
Roman Khlebnov
Надо оттуда вырезать вздох Олега
Вздохнул то не Олег)
источник

RK

Roman Khlebnov in JUG NN
Да?
источник

SK

Sergey Kapralov in JUG NN
Олег — понял)
источник

RK

Roman Khlebnov in JUG NN
:D
источник

SK

Sergey Kapralov in JUG NN
Олег понятливый)
источник

SK

Sergey Kapralov in JUG NN
Олег все понимает)
источник

SK

Sergey Kapralov in JUG NN
Все....
источник

II

Iurii Iurchenko in JUG NN
Sergey Kapralov
Переслано от Sergey Kapralov
Поинвестигировал солюшен через фючи в мапе, выглядит перспективно. Единственное что, в моем случае я б не хотел приплетать дополнительно к существующим тредам еще и FJP + мне бы хотелось чтоб один вызов хевилифтинга исполнялся одним тредом от начала и до конца. И поэтому заменил CompletableFuture на FutureTaskи. Получилось следующее:

java
class Util {
   public static <T> T memoizedCalculation(ConcurrentHashMap<Key, FutureTask<T>> cache, Key key, Callable<T> calculation) {
       try {
           FutureTask<T> t = cache.computeIfAbsent(key, k -> new FutureTask<>(calculation));
           t.run();
           return t.get();
       } catch(Exception ex) {
           throw new RuntimeException(ex);
       }
   }
}

Как такой вариант?
Вариант крутецкий кстати.
источник