|
|
|
HashMap & Threads
|
|||
|---|---|---|---|
|
#18+
Добрый день! Предыстория: Имеется процедура, которая загружает изображения из Интернета и потом, помещает их в базу данных. Процедура вызывается из разных нитей с разными параметрами. Порой бывают ситуации, когда разные потоки пытаются одновременно скачать одинаковые изображения. Хотелось бы избежать двойной работы. Естественно перед загрузкой проверяется наличие изображения в базе данных. Но поскольку процесс загрузки может занимать значительное время – то получается, что одновременно несколько нитей убеждаются, что изображения нет, и одновременно начинают его загружать. (Блокировать на уровне записи в базе данных я не могу – sqlite поддерживает блокировку на уровне файла базы). Я написал класс регулирующий очередь загрузки изображений – класс блокирует повторную загрузку идентичного изображения. "Идентичность" изображения обусловлена равенством двух переменных: uid(long) и name(string). Сначала я реализовал класс с помощью ConcurrentHashMap. Но потом, передумал и сделал с помощью обычного HashMap и synchronized. Я поступил так, потому что в очереди может находится только один элемент с ключом (uid+name) – Set, поэтому в момент вставки элемента нужна полная блокировка всей очереди. Покритикуйте мое решение. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2013, 17:06:56 |
|
||
|
HashMap & Threads
|
|||
|---|---|---|---|
|
#18+
LisichkinСначала я реализовал класс с помощью ConcurrentHashMap. Но потом, передумал и сделал с помощью обычного HashMap и synchronized. Я поступил так, потому что в очереди может находится только один элемент с ключом (uid+name) – Set, поэтому в момент вставки элемента нужна полная блокировка всей очереди.Не очень, всё-таки, понятно, почему не устроили ConcurrentMap , ConcurrentHashMap с готовым атомарным putIfAbsent? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2013, 17:47:32 |
|
||
|
HashMap & Threads
|
|||
|---|---|---|---|
|
#18+
Lisichkin, Lock lock; — локальная переменная и это основной косяк, на вскидку. ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2013, 17:53:42 |
|
||
|
HashMap & Threads
|
|||
|---|---|---|---|
|
#18+
Lisichkin, Упс, сорри. Навскидку промазал) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2013, 18:01:54 |
|
||
|
HashMap & Threads
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. или Код: java 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2013, 18:13:22 |
|
||
|
HashMap & Threads
|
|||
|---|---|---|---|
|
#18+
Чуть-чуть себя поправлю: Код: java 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2013, 18:23:50 |
|
||
|
HashMap & Threads
|
|||
|---|---|---|---|
|
#18+
Прошу прощения в двух предыдущих постах mQueue - ConcurrentHashMap Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2013, 19:08:42 |
|
||
|
HashMap & Threads
|
|||
|---|---|---|---|
|
#18+
Если все, что нужно сделать, это гарантировать, что действие загрузки выполняется только один раз, то в таком сценарии создавать лок для каждой картинки смысла мало. Проще воспользоваться решением на основе названного выше ConcurrentHashMap + FutureTask. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2013, 20:51:01 |
|
||
|
|

start [/forum/topic.php?fid=59&gotonew=1&tid=2129177]: |
0ms |
get settings: |
18ms |
get forum list: |
28ms |
check forum access: |
8ms |
check topic access: |
8ms |
track hit: |
62ms |
get topic data: |
21ms |
get first new msg: |
10ms |
get forum data: |
4ms |
get page messages: |
78ms |
get tp. blocked users: |
4ms |
| others: | 293ms |
| total: | 534ms |

| 0 / 0 |
