|
|
|
Многопоточность: "производительность" при потокобезопасном создании объекта
|
|||
|---|---|---|---|
|
#18+
Есть стандартный механизм потокобезопасного "создания" объекта : double check locking, что то типа того: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Если предположить, что createObj(key) - может быть долгосрочной операцией, то : * если потоки запрашивают объект по одному key - все в порядке: каждый поток ожидает store и создания объекта, так и должно быть * если пришло несколько потоков с разными key, то все они ожидают создания совершенно ненужных им объектов с другими ключами Вопрос: 1й вариант: * синхронизироваться по "ключу", т.е. - в первом synchronized(store) блоке создаем объект пустышку(Object stub) и кладем его в store - во втором synchronized(stub) уже запускаем createObj(key); Со стороны мне он напоминает мой первый велосипед "Эврика". Есть ли какой-то шаблон или правильный ответ на данную задачу, чтобы оптимизировать время ожидания потоков при создании ненужных им объектов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2012, 16:37:46 |
|
||
|
Многопоточность: "производительность" при потокобезопасном создании объекта
|
|||
|---|---|---|---|
|
#18+
если у вас тут действительно много потоков пересекается, то synchronized (store) явно лишняя, конечно же стоит синхронизироваться по ключу. Например использовать Lock, он зачастую удобнее в таких ситуациях. Многое ещё зависит от того какие у вас там типы вообще используются. key это строка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2012, 16:46:35 |
|
||
|
Многопоточность: "производительность" при потокобезопасном создании объекта
|
|||
|---|---|---|---|
|
#18+
Blazkowiczесли у вас тут действительно много потоков пересекается, то synchronized (store) явно лишняя, конечно же стоит синхронизироваться по ключу. Например использовать Lock, он зачастую удобнее в таких ситуациях. Многое ещё зависит от того какие у вас там типы вообще используются. key это строка? Нет, Key - объект с 2мя полями: Class cls, String name Понятно, что если метод оставить в том виде, в котором я его привел - синхронайзд не подходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2012, 16:48:56 |
|
||
|
Многопоточность: "производительность" при потокобезопасном создании объекта
|
|||
|---|---|---|---|
|
#18+
Как-то так, хотя может тоже велосипед. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2012, 16:49:31 |
|
||
|
Многопоточность: "производительность" при потокобезопасном создании объекта
|
|||
|---|---|---|---|
|
#18+
Вопрос теоретический? В ConcurrentHashMap есть метод putIfAbsent ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2012, 16:49:38 |
|
||
|
Многопоточность: "производительность" при потокобезопасном создании объекта
|
|||
|---|---|---|---|
|
#18+
Посмотрите ещё вот здесь, показательный пример с объяснениями http://dmy999.com/article/34/correct-use-of-concurrenthashmap если можно объект создать, а потом уже инициализировать, то можно прям этот пример использовать, только блокировать на экземпляре, если инициализация не закончена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2012, 16:51:04 |
|
||
|
Многопоточность: "производительность" при потокобезопасном создании объекта
|
|||
|---|---|---|---|
|
#18+
ЛагманКак-то так, хотя может тоже велосипед. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Нет, создавать объект заранее - нельзя. Не то, чтобы нельзя - по производительности не подходит ;) Таких объектов может быть и 30 и 40, а все это мапы, достаточно тяжеловесные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2012, 16:52:06 |
|
||
|
Многопоточность: "производительность" при потокобезопасном создании объекта
|
|||
|---|---|---|---|
|
#18+
BlazkowiczПосмотрите ещё вот здесь, показательный пример с объяснениями http://dmy999.com/article/34/correct-use-of-concurrenthashmap если можно объект создать, а потом уже инициализировать, то можно прям этот пример использовать, только блокировать на экземпляре, если инициализация не закончена. Чето да, lazy инициализация должно быть выход. Спасибо ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2012, 16:52:44 |
|
||
|
Многопоточность: "производительность" при потокобезопасном создании объекта
|
|||
|---|---|---|---|
|
#18+
ОзверинBlazkowiczПосмотрите ещё вот здесь, показательный пример с объяснениями http://dmy999.com/article/34/correct-use-of-concurrenthashmap если можно объект создать, а потом уже инициализировать, то можно прям этот пример использовать, только блокировать на экземпляре, если инициализация не закончена. Чето да, lazy инициализация должно быть выход. Спасибо ;) ВСмысле, спасибо за мысль ;) Но как бе тема полна велосипедов и мне интересна ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2012, 16:53:47 |
|
||
|
Многопоточность: "производительность" при потокобезопасном создании объекта
|
|||
|---|---|---|---|
|
#18+
забыл никВопрос теоретический? В ConcurrentHashMap есть метод putIfAbsent Вопрос - практический. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2012, 16:56:24 |
|
||
|
Многопоточность: "производительность" при потокобезопасном создании объекта
|
|||
|---|---|---|---|
|
#18+
ОзверинНет, создавать объект заранее - нельзя. Не то, чтобы нельзя - по производительности не подходит ;) Таких объектов может быть и 30 и 40, а все это мапы, достаточно тяжеловесные. Инстанциируем, лочимся на нём и наполняем. Отсоедините иницализацию от конструктора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2012, 17:09:07 |
|
||
|
Многопоточность: "производительность" при потокобезопасном создании объекта
|
|||
|---|---|---|---|
|
#18+
Можно еще обернуть создание объекта в Future. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2012, 17:24:51 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37978965&tid=2130867]: |
0ms |
get settings: |
11ms |
get forum list: |
22ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
47ms |
get topic data: |
15ms |
get forum data: |
4ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
| others: | 278ms |
| total: | 463ms |

| 0 / 0 |
