|
|
|
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 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевИ оно того стоит? Дык и я о том же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2013, 18:34 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
ваш тест некорректен по следующим причинам (включая, но наверняка не ограничиваясь ими): - переменная counter не используется, т.е., компилятор имеет право выбросить ее, а значит и выбросить циклы. И он это сделает, как только поймет это. Спасет ли чтение волатильной переменной (условие i < N в цикле for), если цикл пустой? Хз, точно сказать не могу. - нет гарантии, что потоки выполняются параллельно. Система имеет полное право отработать так: сначала отрабатывает 1 и завершается поток, потом второй и тд. При этом видимость одновременного доступа есть, но по факту доступ последовательный, а это значит что кешлайн не гуляет между ядрами, и вы не нарываетесь на такую штуку как flase sharing (в данном случае это корректней обозвать true sharing потому что переменная одна, но механизм тот же). А раз вы на нее не нарываетесь, то примерно раз в 20...100 оно будет работать быстрей. - для работы снхронизедов надо, чтобы чтобы компилятор собрал профиль и откомпилил код. Пока он этого не сделает, оно может работать хуже. таким образом вы померяли неверно. У вас что-то померялось, но не то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2013, 13:16 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Хм... AtomicInteger реализован как вызовы класса Unsafe. Возможно синхронизация этих сущностей вынесена из JVM во вне для скорости. Код: java 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2013, 14:09 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
mayton, ты ли это? Atomic реализованы на CAS на уровне команд процессора. Естественно никакой Java API для этого не используется. Только натив. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2013, 14:11 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Это я. И это просто рассуждения вслух. Просто разбираясь с оптимизацией перформанса полезно знать стек. Тоесть что чего вызывает и что от чего зависит. ТС-у полезно также знать что механизмы синхронизации Java построенные на других механизмах Java вряд-ли дадут ему особый прирост скорости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2013, 14:39 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
chabapokваш тест некорректен по следующим причинам (включая, но наверняка не ограничиваясь ими): - переменная counter не используется, т.е., компилятор имеет право выбросить ее, а значит и выбросить циклы. И он это сделает, как только поймет это. Спасет ли чтение волатильной переменной (условие i < N в цикле for), если цикл пустой? Хз, точно сказать не могу. Жду от вас корректного теста и результатов :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 19:49 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Atum1Жду от вас корректного теста и результатов :)Коллега, вы совершенно зря язвите. Вы будете удивлены, но написать качественный многопоточный бенчмарк какого-нибудь реального сценария, в котором есть СУБД, сокеты, работа с файловой системой, и прочие прелести, в разы проще , чем написать качественный бенчмарк, который измерит какой-нибудь volatile vs non-volatile или synchronized vs ReentrantLock. Еще раз акцентирую ваше внимание: в разы проще . Это как в физике. Когда вы рассматриваете тела макроскопически, то это обычная материя, к которой применимы, например, законы Ньютона. Но когда вы спускаетесь на квантовый уровень, вы сразу же начинаете охреневать от неопределенности Гейзенберга, корпусклуярно-волнового Дуализма и прочих "прелестей". В микромире законы маркомира не работают. Микромир значительно сложнее. И Java тут не является исключением. Если хотите лучше понимать, что происходит на таких уровнях, то рекомендую вам сделать следующее: 1) Почитать Java Concurreny in Practice - для разгона 2) Почитать The Art of Multiprocessor Programming - что бы понимать, как создавали классы из java.util.concurrent, тут уже ягодки идут 3) Почитать папИр Дага Ли, в котором он рассказывает, как создавался AbstractQueueSynchronzer: http://gee.cs.oswego.edu/dl/papers/aqs.pdf 4) Подписаться на мэилинг-лист concurrency-interest 5) Посмотреть презенташки по многопоточности из JUG.RU: http://vk.com/jugru 6) Почитать и пощупать Шипилевский JMH. Вот когда сделаете это, тогда и будете здесь подстебывать мемберов, и пытаться брать их "на слабо". А сейчас "слабо" вам, так что лучше не отвергать предлагаемую помощь, и слушать советы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 20:17 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
cdtyjv, обычно уже на 3-4 пункте начинаешь осознавать свою неполноценность:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 20:23 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
cdtyjvМикромир значительно сложнееПроще. Но от этого не легче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 20:31 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
cdtyjvВот когда сделаете это, тогда и будете здесь подстебывать мемберов, и пытаться брать их "на слабо". А сейчас "слабо" вам, так что лучше не отвергать предлагаемую помощь, и слушать советы. Да я и не подстебывал . все замечания описанные выше имеют место быть. А так же опираясь на Ваш тезис о микромире - можно сказать след. А что мешает : А) переменная counter не используется - а может и используется. или сделать простую проверку чтобы она использовалась. Б) нет гарантии, что потоки выполняются параллельно - но и нет опровержения. В) для работы снхронизедов надо, чтобы чтобы компилятор собрал профиль и откомпилил код - если добавить более четкие параметры для кода - получим точно такую же ситуацию - исходя из пунктов А и Б. Это JAVAAAA (c) - тут вообще нет честных тестов :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 20:41 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Atum1, От меня корректного теста не будет, по той причине что я сам пока не знаю как это померять. Когда-то скачивал jmh - и не понял его. Документировано там все слабовато, и есть самоисключающие примеры. Самоисключающие - это когда результаты теста противоречат сами себе. Так и не понял, как им пользоваться. Верней, как пользоваться ясно, но как правильно написать тест и померять именно то, что я хочу - неясно. И судя по тому как вы злитесь, подстебнули не вы меня, а я вас. :) Сам меряю производительность так: пишутся варианты реальной программы и ей подсовываю данные близкие к реальным. На микроуровне я уже понял, что тестить что-то бесполезно. Насчет используется/не используется тоже не все так очевидно. На самом деле, использовать переменную просто - выводим ее на печать. Только такое использование спасет от оптимизации "выбрасывания", но не спасет от оптимизации анролинга циклов, например. А просто использование проверкой тоже может быть оптимизировано, если оно не несет смысловой нагрузки. > Б) нет гарантии, что потоки выполняются параллельно - но и нет опровержения. вот я и говорю - мы меряем непонятно что. из личных практических наблюдеий - если есть 10 потоков, то эти потоки по факту стартуют не в той последовательности как их запускаешь в цикле. Следовательно, как минимум, часть инкрементов была выполнена без реальной конкуренции за данные, а значит и завершение потоков было не одновременным на сколько-то. Это с высокой вероятностью можно предполагать. ps. Посмотрите исходники ReentrantLock, может накопаете чего интересного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2013, 14:53 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
chabapokОт меня корректного теста не будет, по той причине что я сам пока не знаю как это померять. Что-то ты перемудрил. И так везде пишут что при высокрой нагруженности ReentrantLock более производительный чем synchronized, что тест выше и показал. Но в реальности это ничего не даёт. Так как подобная конкуренция встречается не часто. А при низкой конкурентности synchronized покажет лучшие результаты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2013, 14:56 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Я не перемудрил, я привык критически смотреть на то, что пишут в интернете, выборочно проверяя (в том числе с целью самообучения) некоторые утверждения. Да, ReentrantLock, да пишут. Но как повторить самому это дома - я незнаю, о чем и сообщил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2013, 23:01 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
chabapokНо как повторить самому это дома - Ну создаешь Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. Массивчик на 1000 инкрементеров. И два потока которые много раз пробегают по массиву (в разные стороны) и вызывают inc(). И тоже самое через Lock. Встречаться они должны не часто - вот и низкая конкуренция. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2013, 12:15 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Возник такой вопрос : а как построить самый быстрый счетчик - инкремент , который будет безопасно работать многопоточной среде ? что то есть быстрее AtomicInteger ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2014, 23:23 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Atum1Возник такой вопрос : а как построить самый быстрый счетчик - инкремент , который будет безопасно работать многопоточной среде ? что то есть быстрее AtomicInteger ? Есть. Каждому потоку выдать по своему счетчику и в конце просуммировать по всем потокам. На сколько я помню, должно быть быстрее AtomicInteger. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2014, 23:31 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Atum1 , LongAdder. Основан на другом принципе - инкременты с разных потоков идут в разные переменные, тем самым снижая contention. А когда надо получить сумму - просто проходим по ним, и суммируем. Для точных вычислений он не пригоден, но очень резв. С другой стороны, начиная с Java7 для CASов стандартных атомиков сделаны интринсики, которые устремляют к нулю количество "обломов" на одновременных CAS-ах с разных потоков, поэтому с выходом Java7 атомики стали заметно шустрее на некоторых платформах, включая наш родной x86. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2014, 23:34 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Вернее, не для самих CASов, а для некоторых других методов, которые основаны на них. Например, incrementAndGet(), addAndGet() и т.д.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2014, 23:40 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
О! спасибо! как раз нашел https://github.com/takipi/counters-benchmark/tree/master/src/main/java/com/takipi/tests/counters/implementations и описание : http://www.takipiblog.com/2014/04/16/java-8-longadders-the-fastest-way-to-add-numbers-concurrently/ видимо не я один такими вопросами задаюсь :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2014, 23:52 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Вспомнив, что ускорение на порядок куска кода, занимающего десять процентов общего времени даёт (всего) девять процентов выигрыша, начинаешь прикидывать - стОит ли вообще овчинка выделки?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2014, 02:11 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, ну хз.... может в торговых система и имеет :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2014, 13:59 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Кто может объяснить на каких операциях будет разница между этими типами : AtomicInteger vs LongAdder vs LongAccumulator http://winterbe.com/posts/2015/05/22/java8-concurrency-tutorial-atomic-concurrent-map-examples/ написал тест такого плана - разницу не увидел , почему ? только от N=10000000 - но там и погрешность есть ... Код: 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. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2015, 10:54 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Atum1, Разницы не видно из-за того, что бенчамарк тестирует не счетчики, а создание и остановку потоков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2015, 14:09 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
schwaAtum1, Разницы не видно из-за того, что бенчамарк тестирует не счетчики, а создание и остановку потоков. ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2015, 15:01 |
|
||
|
test synchronized vs ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Atum1, Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Что делает этот код? 1 - создать 4 потока 2 - выполнить какой-то код в 4 потоках 3 - остановить потоки Шаги 1 и 3 в сумме съедают больше времени, чем суммирование счетчиков. Из-за того, что у вашем бенчмарке фиксированное число потоков (при этом очень маленькое), вы иногируете тот факт, что классы LongAdder и LongAccumulator разработаны для совершенно иной ситуации - когда потоков много и они соревнуются между собой за одну единствунную ячейку памяти. Вот результат бенчмарка, запущенного на n1-standard x16 CPU виртуалке на Google Compute Engine Код: html 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Характеристики виртуалки $ lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 8 On-line CPU(s) list: 0-7 Thread(s) per core: 2 Core(s) per socket: 4 Socket(s): 1 NUMA node(s): 1 Vendor ID: GenuineIntel CPU family: 6 Model: 45 Model name: Intel(R) Xeon(R) CPU @ 2.60GHz Stepping: 7 CPU MHz: 2600.000 BogoMIPS: 5200.00 Hypervisor vendor: KVM Virtualization type: full L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 20480K NUMA node0 CPU(s): 0-7 Сам бенчмарк, не претендует на идеал, но по крайней мере здесь всеми потоками рулит JMH и, следовательно, числа в итогом отчете содержат минимум шума. Можно запустить побольше форков и поиграться со счетчиком в цикле, но отличия в производительности уже и так есть (что не удивительно). java -jar target/benchmarks.jar -wi 10 -i 10 -f 1 Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2015, 00:24 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2125136]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
54ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 335ms |

| 0 / 0 |
