|
|
|
Многопоточная запись в буфер
|
|||
|---|---|---|---|
|
#18+
Помогите, пожалуйста, разобраться со следующей проблемой. Хочу сделать скидывание сообщений в некий буфер, при достижении порогового значения буфер сохраняется на диск. Код: Код: 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. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. В строке map2 = new HashMap<String, String>(map); регулярно возникает ConcurrentModificationException, т.е. эту строку одновременно выполняет несколько потоков. При этом вывод в консоль имеет следующий вид: Before flush:104;1 Before flush:111;2 After flush:0;2 Т.е. карта, содержащая 104 строки утеряна. Таким образом получается, что метод Код: java 1. выполняется в нескольких потоках? Естественно, помечать метод write() как synchronized, не хочется Нормальный вывод имеет вид: Before flush:125;3 After flush:0;3 Before flush:100;4 After flush:0;4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2012, 12:46:49 |
|
||
|
Многопоточная запись в буфер
|
|||
|---|---|---|---|
|
#18+
Взять готовый кэш не вариант? EhCache, например. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2012, 12:54:35 |
|
||
|
Многопоточная запись в буфер
|
|||
|---|---|---|---|
|
#18+
Ещё для общего развития рекомендую изучить вот этот package http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/package-summary.html и разобратся с задачей читателей и писателей (ReadWriteLock) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2012, 12:57:27 |
|
||
|
Многопоточная запись в буфер
|
|||
|---|---|---|---|
|
#18+
malahov.sa, что касается ошибки, то она возникает при доступе к map. При создании map2 вы указываете базовую карту, доступ к которой не синхронизирован и возможен из write() и sendSomewhere() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2012, 13:21:18 |
|
||
|
Многопоточная запись в буфер
|
|||
|---|---|---|---|
|
#18+
BlazkowiczВзять готовый кэш не вариант? EhCache, например. Да собственно, он и взят уже) У меня не практический вопрос, а скорее, теоретический. Если честно, смотрел уже в этот пакет, особенно на ConcurrentLinkedQueue. Немного смущает в исходниках наличие misc.unsafe. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2012, 13:29:50 |
|
||
|
Многопоточная запись в буфер
|
|||
|---|---|---|---|
|
#18+
Miha_S7, почему не синхронизирован? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. пока идет копирование add не вызывается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2012, 13:31:54 |
|
||
|
Многопоточная запись в буфер
|
|||
|---|---|---|---|
|
#18+
[quot malahov.sa] while (copying) { try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } [/src] Это худший вариант синхронизации, который только можно было придумать. Он помимо того что занимает поток так же как и synchronized, так ещё и жрет попусту CPU. Если это просто неудачная попытка реализовать spinlock, то этого делать не нужно. spinlock уже реализован для synchronized. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2012, 13:36:02 |
|
||
|
Многопоточная запись в буфер
|
|||
|---|---|---|---|
|
#18+
malahov.saЕсли честно, смотрел уже в этот пакет, особенно на ConcurrentLinkedQueue. Немного смущает в исходниках наличие misc.unsafe. Смущают в каком плане? Слово страшное? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2012, 13:37:52 |
|
||
|
Многопоточная запись в буфер
|
|||
|---|---|---|---|
|
#18+
malahov.saУ меня не практический вопрос, а скорее, теоретический. Если вопрос теоретический, то я уже дал наиболее полезный совет 1-е разобратся в теоретической задаче читаталей и писателей. Материала даже по-русски валом. 2-е разобратся с вышеуказаным пакетом. Дабы не городить бесполезных Worker-ов и не изобретать Lock заново. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2012, 13:42:24 |
|
||
|
Многопоточная запись в буфер
|
|||
|---|---|---|---|
|
#18+
malahov.sa, представим ситуацию. T1 прошёл по write дошёл до sendSomewhere(); вызывается sendSomewhere: получаем блокировку на this устанавливаем флаг copying пока мы получали блокировку вылезает другой тред T2, который в строчке while (copying) видит, что флаг не установлен(T1 ещё не установил его, так как занят получением блокировки) и проделывает операции в картой. Дальше всё понятно. Если вам пришла в голову идея сделать что-нибудь наподобие: Код: java 1. 2. 3. 4. то это плохая идея. Самый простой вариант - использовать ConcurrentHashMap для map и вместо Код: java 1. сделать Код: java 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2012, 13:48:20 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=317&tid=2132880]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
29ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
2ms |
| others: | 318ms |
| total: | 418ms |

| 0 / 0 |
