|
|
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
zig zuКак пример: Всё равно не очевидно. Вижу минимум 2 варианта. Код: java 1. 2. 3. 4. 5. Или Код: java 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 19:05 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz- updateData() стоило бы объявить synchronized, если там подразумеваются долгие вычисления. Если нет, то не понятно кто будет гарантировать, что "тяжелые" вычисления не будут запускаться параллельно. - локальная переменная в get-методе лишняя, как и 2й get-метод Так вся суть как раз в том, чтобы нигде synchronized не было. Мой класс Data вообще не блокирующий не для читающих ни для пишущего потока. Для этого и локальные ссылки нужны в методах. Обновлять может только один поток, более подробный код метода обновления я привел выше. Несколько методов get осуществляют поиск по разным ключам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 19:08 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
zig zuОбновлять может только один потокВ приведеном коде ничто не мешает двум потокам обновить данные zig zuболее подробный код метода обновления я привел выше.Не самый лучший вариант кстати - зависимость класса Data на класс User - плохо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 19:15 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
zig zuТак вся суть как раз в том, чтобы нигде synchronized не было. Для записи раз в сутки очень важно чтобы методы записи были не блокирующими. Так? zig zuМой класс Data вообще не блокирующий не для читающих ни для пишущего потока. Я вижу. Поэтому объясняю к чем это приведет. zig zuДля этого и локальные ссылки нужны в методах. Не вижу связи, если вы читаете только по одному ключу. Если в get методе много операций, тогда ладно. Но вы же не напрягаете себя объяснением таких нюансов. zig zuОбновлять может только один поток "Я так сказал". Да? Других причин почему это так нет? Если без иронии, то вопрос простой. Кто гарантирует что это только один поток? zig zuНесколько методов get осуществляют поиск по разным ключам. Возможно это важно в вашем проекте, но приведенный код никак не объясняет зачем это сделано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 19:19 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczНе понятно зачем два метода getData() и зачем в них хранить ссылку в локальной переменной. Вот это правильное замечание, локальная ссылка в методах get может действительно не нужна? Я правильно понимаю, что при вызове метода get в стеке потока будет создана копия ссылки на мапу data? П.С. А разные методы get ищут по разным ключам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 19:20 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
zig zuВот это правильное замечание, локальная ссылка в методах get может действительно не нужна? Зависит от реализации метода, которую вы опустили. zig zuЯ правильно понимаю, что при вызове метода get в стеке потока будет создана копия ссылки на мапу data? Нет, не создаётся. Просто если ссылка используется только один раз, что для приведенного кода логично, то и для чего хранить эту ссылку на стеке, не ясно. zig zuП.С. А разные методы get ищут по разным ключам. Вариант сделать ключ аргуметом метода не рассматривается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 19:24 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
For AllВам уже ответили, что ConcurrentHashMap уже реализует нужную вам фунциональность: BlazkowiczИдея Copy on Write в том что бегущие потоки используют старую версию данных, что вполне безопасно. А "новые" потоки, посетившие кэш уже получат новую копию1) ConcurrentHashMap к copy-on-write никакого отношения не имеет, это два совершенно разных подхода. 2) Автору не нужны конкурентные обновления конкретных элементов, ему нужно иногда обновлять ВСЕ элементы. Поэтому и ConcurrentHashMap ему не нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 20:00 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz- updateData() стоило бы объявить synchronized, если там подразумеваются долгие вычисления. Если нет, то не понятно кто будет гарантировать, что "тяжелые" вычисления не будут запускаться параллельно.Учитывая логику этого метода - полная перезапись всей мапы - synchronized здесь не нужен совершенно. Blazkowicz- локальная переменная в get-методе лишняя, как и 2й get-методЛокальная переменная здесь кака раз таки является ключевым местом. Она вместе с модификатором volatile на data позволяет работать вообще без синхронизации. BlazkowiczТак же как и применение сюда термина "кеш", который в комбинации с Map, обычно служит совершенно иным задачам.Отнюдь, код, приведенный автором, - как раз таки является классическим кэшем, только вместо операции put у него bulk update.[/quot] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 20:11 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
For AllНе самый лучший вариант кстати - зависимость класса Data на класс User - плохоНе зная контекста задачи такие выводы делать нельзя. Изначально ничего плохого в этом нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 20:13 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
zig zuЯ правильно понимаю, что при вызове метода get в стеке потока будет создана копия ссылки на мапу data?Нет, не будет. Поэтому локальная переменная обязательна, если вы обращаетесь в get-методе к data больше, чем один раз, так как в противном случае вы рискуете нарваться на race condition, когда одна операция выполнена на одной мапе, а вторая уже на другой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 20:16 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
DEVcoachBlazkowicz- локальная переменная в get-методе лишняя, как и 2й get-методЛокальная переменная здесь кака раз таки является ключевым местом. Она вместе с модификатором volatile на data позволяет работать вообще без синхронизации.Отбой, это я про первый метод написал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 20:17 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
DEVcoachУчитывая логику этого метода - полная перезапись всей мапы - synchronized здесь не нужен совершенно. Не нужен здесь, значит нужен где-то ещё. Потому как автор хочет тяжелые вычисления делать где-то единственным потоком. DEVcoachОтнюдь, код, приведенный автором, - как раз таки является классическим кэшем, только вместо операции put у него bulk update. Кешем оно не является вообще, так как код автора сводиться к одному единственному volatile полю, в итоге. Смотри. HashMap к вопросу отношения не имеет. Значит это любой бизнес объект. Заполнять бизнес объект в методе updateData тоже смысла нет, можно заполнить и снаружи, передавая готовое значение. Ведь метод не synchronized, значит тяжелые вычисления делаются вне его. Точно так же getData это лишь делегат для volatileField.get(); В итоге, всё сводиться к тому что кроме объявления волатайл поля, весь остальной код это шум. Поэтому назвать поле кэшем у меня язык не поворачивается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 21:30 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
Blazkowiczzig zuОбновлять может только один поток "Я так сказал". Да? Других причин почему это так нет? Если без иронии, то вопрос простой. Кто гарантирует что это только один поток? Я гарантирую. Это мое упущение при описании требований к моему кешу. Есть специальный поток, который вызывает веб сервис и передает данные в полученном виде в метод updateData, там уже происходит конвертация и сохранение во внутреннею мапу. В плане реализации это будет singleton ejb timer или спринговый шедулер. В целом я убедился, что предложенный мной подход в первом посте будет работать. Всем спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 10:54 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
zig zuЯ гарантирую. Ну, вот и я о том же. zig zuЕсть специальный поток, который вызывает веб сервис и передает данные в полученном виде в метод updateData, там уже происходит конвертация и сохранение во внутреннею мапу. В плане реализации это будет singleton ejb timer или спринговый шедулер. Ню-ню. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 11:03 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38648020&tid=2127151]: |
0ms |
get settings: |
6ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
152ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
30ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 422ms |

| 0 / 0 |
