|
|
|
codereview самописный потокобезопасный stack
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев Поэтому либо полная остановка изменяющих нитей, либо не актуальность. Ну в теории ведь есть multi CAS, допустим хранить счетчик размера стэка в отдельном поле и CASиться по нему и верху стэка. Не практично само собой, так, чтоб дискуссию поддержать:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2017, 18:46 |
|
||
|
codereview самописный потокобезопасный stack
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевНо тогда можно пользоваться только синхро коллекцией. А в чем смысл?Смысл в актуальности (: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2017, 19:00 |
|
||
|
codereview самописный потокобезопасный stack
|
|||
|---|---|---|---|
|
#18+
забыл никСергей Арсеньев Поэтому либо полная остановка изменяющих нитей, либо не актуальность. Ну в теории ведь есть multi CAS, допустим хранить счетчик размера стэка в отдельном поле и CASиться по нему и верху стэка. Не практично само собой, так, чтоб дискуссию поддержать:) а как это сделать? одновременно CASиться по размеру и по неизменной голове стека? код, плиз ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2017, 19:07 |
|
||
|
codereview самописный потокобезопасный stack
|
|||
|---|---|---|---|
|
#18+
questioner, Код: 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. тынц ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2017, 19:25 |
|
||
|
codereview самописный потокобезопасный stack
|
|||
|---|---|---|---|
|
#18+
Usman, а это на что ответ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2017, 19:27 |
|
||
|
codereview самописный потокобезопасный stack
|
|||
|---|---|---|---|
|
#18+
questioner, По поводу реализации метода size() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2017, 19:29 |
|
||
|
codereview самописный потокобезопасный stack
|
|||
|---|---|---|---|
|
#18+
Тут на самом деле 3 варианта (по степени возростания консистентности (отражения реального положения дел в стеке)): 1. Тупо получить ссылку на топ и пройтись до null, просуммировав количество элементов Это O(n) 2. Добавить AtomicLong и перед put/pop инкрементить/декрементить Это O(1) 3. Добавить поле long index в Entry, и присваивать его в момент создания Entry, тогда получить размер будет - topPointer.get().index; Это тоже O(1). Здесь тоже возможна ситуация когда между topPointer.get() и получением поля index будет вставлен(ы) элемент(ы), но операций требуется значительно меньше, чем с AtomicLong. Мое имхо, мне больше нравится этот способ : ). В ConcurrentLinkedList по O(1) размер уже не вернешь видимо... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2017, 20:50 |
|
||
|
codereview самописный потокобезопасный stack
|
|||
|---|---|---|---|
|
#18+
no568923. Добавить поле long index в Entry, и присваивать его в момент создания Entry, тогда получить размер будет - topPointer.get().index; Это тоже O(1). Здесь тоже возможна ситуация когда между topPointer.get() и получением поля index будет вставлен(ы) элемент(ы), но операций требуется значительно меньше, чем с AtomicLong. Мое имхо, мне больше нравится этот способ : ). В ConcurrentLinkedList по O(1) размер уже не вернешь видимо... Ну взяли вы индекс - например 9, начали создавать Entry, заснули, пришло еще 3 потока, индекс уже 12, это не вариант ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2017, 20:54 |
|
||
|
codereview самописный потокобезопасный stack
|
|||
|---|---|---|---|
|
#18+
забыл никno568923. Добавить поле long index в Entry, и присваивать его в момент создания Entry, тогда получить размер будет - topPointer.get().index; Это тоже O(1). Здесь тоже возможна ситуация когда между topPointer.get() и получением поля index будет вставлен(ы) элемент(ы), но операций требуется значительно меньше, чем с AtomicLong. Мое имхо, мне больше нравится этот способ : ). В ConcurrentLinkedList по O(1) размер уже не вернешь видимо... Ну взяли вы индекс - например 9, начали создавать Entry, заснули, пришло еще 3 потока, индекс уже 12, это не вариант Индекс присваивается до CAS, если пришло еще 3 потока, то когда проснемся CAS не пройдет, цикл повторится и уже будем новый индекс вставлять... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2017, 20:59 |
|
||
|
codereview самописный потокобезопасный stack
|
|||
|---|---|---|---|
|
#18+
questionerзабыл никпропущено... Ну в теории ведь есть multi CAS, допустим хранить счетчик размера стэка в отдельном поле и CASиться по нему и верху стэка. Не практично само собой, так, чтоб дискуссию поддержать:) а как это сделать? одновременно CASиться по размеру и по неизменной голове стека? код, плиз Ага, может еще и ключи от квартиры? Я же говорю, что в ТЕОРИИ. Просто лень напрягать мозги в выдуманной ситуации, то что метод size() в конкурентной коллекции может выдавать не всегда конкретные ответы, это разумный компромисс. Но, если бы вдруг мне понадобилось что-нибудь этакое, на multi-CAS, я бы начал смотреть вот отсюда - AtomicMarkableReference ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2017, 21:05 |
|
||
|
codereview самописный потокобезопасный stack
|
|||
|---|---|---|---|
|
#18+
no56892Индекс присваивается до CAS, если пришло еще 3 потока, то когда проснемся CAS не пройдет, цикл повторится и уже будем новый индекс вставлять... Я немного запутался о какой версии кода вы уже тут говорите:) Как у вас CAS от индекса зависит? Я к тому что compareAndSwapить будете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2017, 21:09 |
|
||
|
codereview самописный потокобезопасный stack
|
|||
|---|---|---|---|
|
#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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2017, 21:20 |
|
||
|
codereview самописный потокобезопасный stack
|
|||
|---|---|---|---|
|
#18+
UsmanСергей АрсеньевНо тогда можно пользоваться только синхро коллекцией. А в чем смысл?Смысл в актуальности (: А как синхроколлекция даст актуальность? Ведь в момент return число может стать уже не соответствующим действительности. В силу этого ни о какой актуальности речи не будет. Блокировка должна быть до конца применения значения size(), типа: Код: java 1. может вызвать NPE. Посему какая разница неправильный размер он был получен внутри или снаружи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2017, 21:38 |
|
||
|
codereview самописный потокобезопасный stack
|
|||
|---|---|---|---|
|
#18+
забыл никЯ немного запутался о какой версии кода вы уже тут говорите:) Как у вас CAS от индекса зависит? Я к тому что compareAndSwapить будете? Он имеет ввиду, что присвоение одному AtomicReference (ссылки на голову) и увеличение другого AtomicInteger (счетчика) одновременно не сделаешь. А значит size на основе счетчика может вернуть не правду. Правда оно и не важно. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2017, 21:41 |
|
||
|
codereview самописный потокобезопасный stack
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, Конечно если не делать вариант, что Entry сразу хранит счетчик. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2017, 21:43 |
|
||
|
codereview самописный потокобезопасный stack
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев Блокировка должна быть до конца применения значения size() В таком варианте да, а вот например: Код: java 1. 2. 3. вполне себе нормально ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2017, 21:54 |
|
||
|
codereview самописный потокобезопасный stack
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевА как синхроколлекция даст актуальность?на момент возвращения будет актуальное значениеСергей АрсеньевВедь в момент return число может стать уже не соответствующим действительности.в момент выхода из синхро-блока (если потоки все еще "крутятся") Сергей АрсеньевВ силу этого ни о какой актуальности речи не будет.см. 20194593 : Код: plaintext Сергей АрсеньевБлокировка должна быть до конца применения значения size()А вот тут я соглашусь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2017, 22:17 |
|
||
|
codereview самописный потокобезопасный stack
|
|||
|---|---|---|---|
|
#18+
no568922. Добавить AtomicLong и перед put/pop инкрементить/декрементить Это O(1) а можно ведь только однажды это сделать перед возвращением значения пользователю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2017, 00:46 |
|
||
|
codereview самописный потокобезопасный stack
|
|||
|---|---|---|---|
|
#18+
забыл никНу взяли вы индекс - например 9, начали создавать Entry, заснули, пришло еще 3 потока, индекс уже 12, это не вариант Entry засунется только тогда, когда между ним и головой никто не успел всунуться. Если успели все одно Entry переделывать перед новой попыткой вставки. Так что метод относительно действенный. Если только не бесполезный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2017, 09:37 |
|
||
|
codereview самописный потокобезопасный stack
|
|||
|---|---|---|---|
|
#18+
questionerno568922. Добавить AtomicLong и перед put/pop инкрементить/декрементить Это O(1) а можно ведь только однажды это сделать перед возвращением значения пользователю Только вот то, что запрос значения может оказаться раньше инкремента/декремента может привести к тому, что значение будет чуть менее чем полностью отличаться от актуального. Что правда не важно. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2017, 09:42 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39401216&tid=2123165]: |
0ms |
get settings: |
6ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
67ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
73ms |
get tp. blocked users: |
1ms |
| others: | 196ms |
| total: | 378ms |

| 0 / 0 |
