|
|
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
помогите понять почему synchronized так сильно проигрывает ReentrantLock ? run: lock.lock() 5000000 Time spent: 0.234059174 sec syninc 5000000 Time spent: 0.989136139 sec у меня получается что с каждым новым тредом время растет линейно у synchronized! я начал с 2x тредов и до 5 ! Параметры JVM ставил разные : XX:-UseBiasedLocking секция synchronized - дорогая , возможно если поток завладел ей и его ОС отложила,то все остальные ждут но если шедулер ОС остановит Lock, тоже все буду ждать, так же ? или нет ? Код: 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. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 12:43 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Интересно посмотреть на код для 10 потоков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 12:46 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
BlazkowiczИнтересно посмотреть на код для 10 потоков. :) просто копировал. чтобы понять как растет время , а оно растет . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 12:49 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
А давайте в качестве эксперимента, поменяем очередность теста и посмотрим результат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 12:50 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
BlazkowiczА давайте в качестве эксперимента, поменяем очередность теста и посмотрим результат. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 12:52 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
По этим двум результатам запускал цикл . результаты примерно такие в серии из 100 циклов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 12:54 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
BlazkowiczА давайте в качестве эксперимента, поменяем очередность теста и посмотрим результат. Код: 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. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 12:58 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Здесь низкоуровневые объяснения http://cheremin.blogspot.com/2011/11/synchronized-vs-reentrantlock.html По всем остальным тестам в гугле - выводы такие же. Lock как API имеет ряд фич, которые труднее реализовать с synchronized. Lock действительно быстрее при высокой конкуретности. Т.е. как в вышеприведенном тесте, потоки постоянно в борьбе за ресурс. synchronized будет быстрее в однопоточном исполнении за счет Biased Locking. Разницы при небольшой конкуретности особой нет, можно пользовать и то и другое, к тому же объем критической секции почти всегда нивелирует разницу в производительности между этими блокировками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 13:31 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЗдесь низкоуровневые объяснения http://cheremin.blogspot.com/2011/11/synchronized-vs-reentrantlock.html По всем остальным тестам в гугле - выводы такие же. Lock как API имеет ряд фич, которые труднее реализовать с synchronized. Lock действительно быстрее при высокой конкуретности. Т.е. как в вышеприведенном тесте, потоки постоянно в борьбе за ресурс. synchronized будет быстрее в однопоточном исполнении за счет Biased Locking. Разницы при небольшой конкуретности особой нет, можно пользовать и то и другое, к тому же объем критической секции почти всегда нивелирует разницу в производительности между этими блокировками. Ок! спасибо! Буду теперь думать где что применять :) А вопрос у меня возник , когда наткнулся на такой код singleton : Код: java 1. 2. 3. 4. 5. 6. Насколько провисает производительность при получении ссылки на фабрику в многопоточной среде ... Если фабрика используется в jsp страницах для получения данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 14:35 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Atum1Насколько провисает производительность при получении ссылки на фабрику в многопоточной среде ... Если фабрика используется в jsp страницах для получения данных. На децл, но провисает. Чем больше юзеров, тем больше задержка. Для сервера не очень хороший код. Че было не взять любой IoC DI контейнер не понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 14:47 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Atum1 , Если не хотите провисать, то сделайте double-checked locking, и вопрос про synchronized/lock отпадет сам собой: http://habrahabr.ru/post/143390/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 14:48 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
cdtyjvЕсли не хотите провисать, то сделайте double-checked locking, и вопрос про synchronized/lock отпадет сам собой: http://habrahabr.ru/post/143390/ Я где-то читал что новые гарантии JMM в Java 6 хоть и улучшают ситуацию с DCL, но не исправляют её окончательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 15:02 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
cdtyjv Atum1 , Если не хотите провисать, то сделайте double-checked locking, и вопрос про synchronized/lock отпадет сам собой: http://habrahabr.ru/post/143390/ DCL не нужен, если использовать ленивость Java через дополнительный Holder класс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 15:02 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЯ где-то читал что новые гарантии JMM в Java 6 хоть и улучшают ситуацию с DCL, но не исправляют её окончательно. DCL не нужен, если использовать ленивость Java через дополнительный Holder класс.По приведенной выше ссылке оба эти вопроса рассматриваются в деталях. Классический DCL работает через synchronized + volatile начиная с 5.0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 15:28 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
cdtyjvBlazkowiczЯ где-то читал что новые гарантии JMM в Java 6 хоть и улучшают ситуацию с DCL, но не исправляют её окончательно. DCL не нужен, если использовать ленивость Java через дополнительный Holder класс.По приведенной выше ссылке оба эти вопроса рассматриваются в деталях. Классический DCL работает через synchronized + volatile начиная с 5.0. собственно секция synchronized для singleton при получении ссылки и не нужна . Как мне кажется компилятор должен ее убрать через какое то количество циклов , если он умный . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2013, 23:13 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Atum1собственно секция synchronized для singleton при получении ссылки и не нужна . Как мне кажется компилятор должен ее убрать через какое то количество циклов , если он умный .Не совсем понял, что вы имеете ввиду. Если вы про классический double-checked locking, то там используется связка volatile + synchronized. Да, после инициализации мы не будем приходить в ветку с synchronized, но компилятор не сможет ее выкинуть, так как не сможет заоптимизировать первую проверку на null, ибо она идет по volatile полю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2013, 08:40 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Господа не поясните тупому, а нужен ли volatile при DCL если проверку развернуть на противоположную? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2013, 10:54 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевГоспода не поясните тупому, а нужен ли volatile при DCL если проверку развернуть на противоположную? Код покажи. Многопоточное создание экземпляра как отработает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2013, 10:57 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, хотя да нужен, может ведь не весь адрес записаться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2013, 10:57 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Самый показательный результат дает AtomicInteger При N= 100000000 и 10 потоках он рвет и synchronized и обходит lock() Код: java 1. 2. 3. 4. 5. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2013, 15:00 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Atum1Самый показательный результат дает AtomicInteger Открыл глаза. Google -> CAS -> Lock Free, etc Atum1При N= 100000000 и 10 потоках он рвет и synchronized и обходит lock() Потому что CAS это не блокировка. А Lock и synchronized - это блокировка. Atum1lock.lock() - 5.434246025 sec syninc - 21.641281703 sec AtomicReference - 3.083562757 sec Тест меряет максимальную нагрузку на лок - идет постоянная конкуренция. Только в этом случае Lock дает значительные выигрышь перед synchronized. Т.е. это единственный критерий. Надобность в такой блокировке возникает не часто. А если она возникает часто, то можно подумать над тем как реализовать то же самое без критической секции вообще. В то же время при низкой конкуренкции synchronized может выдать лучшую производительность за счет Biased Locking или просто такую же как RL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2013, 15:11 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Теперь вопрос как правильно написать Singleton через AtomicReference , так чтобы он возвращал еще быстрее , можно создать пул который будет пополняться экземплярами класса Singleton - и забираться по AtomicReference при вызове. Пример : Есть сервлет - в котором есть ссылка на сonfig - это Map<String, String> ключ значение . Эта мапа обновляется очень редко, но при каждом запросе пользователя мы берем из нее данные для генерации страницы : Код: 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. код сервлета : Код: java 1. 2. 3. 4. 5. т.е. в Местах обращения к siteConfig.getConfig() и получения ссылки на единственный экземпляр ConcurrentMap<String, String> мы будем иметь конкуренцию За ссылку siteConfig ??? чтобы ее снять какие действия нам нужно предпринять ? Добавить в класс SiteConfigSeriveImpl pool из AtomicReference из ConcurrentMap<String, String> сonfig; которые мы будем постоянно насыщать ... и отдавать при запросах ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2013, 15:22 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Atum1Теперь вопрос как правильно написать Singleton через AtomicReference , так чтобы он возвращал еще быстрее , можно создать пул который будет пополняться экземплярами класса Singleton - и забираться по AtomicReference при вызове. http://www.rsdn.ru/forum/java/4473617 http://stackoverflow.com/questions/5938163/singleton-using-atomicreference ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2013, 15:25 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Blazkowicz http://www.rsdn.ru/forum/java/4473617 http://stackoverflow.com/questions/5938163/singleton-using-atomicreference Может я не прав, но пример по первой ссылке даже без конкуренции вызовет конструктор два раза, а в условиях оной даже больше. Если конструктор не прописывает созданный экземпляр в каком-нибудь списке то просто лишняя работа. Во втором случае можно получить не полностью инициализированный instance. И оно того стоит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2013, 18:32 |
|
||
|
|

start [/forum/topic.php?fid=59&tid=2125136]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
59ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 389ms |

| 0 / 0 |
