|
|
|
В чем прикол дженерика ThreadLocal
|
|||
|---|---|---|---|
|
#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. Если вместо ThreadLocal использовать Integer (использовать закомменченные строки), то вывод будет тот же самый. Спрашивается, зачем тогда ThreadLocal? ЗЫ В официальной доке можно проделать то же самое ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2017, 17:13 |
|
||
|
В чем прикол дженерика ThreadLocal
|
|||
|---|---|---|---|
|
#18+
У вас 3 не связанных с друг другом вопроса. 1. авторВ чем прикол дженерика ThreadLocal Ни в чем. Точно такой же генерик как и любой другой. 2. авторЕсли вместо ThreadLocal использовать Integer (использовать закомменченные строки), то вывод будет тот же самый Особенности тестирования многопоточности. То что ваш код работает в какой-то единственной ситуации ещё не делает его потокобезопасным и не даёт никаких гарантий что он будет работать точно так же в других обстоятельствах. Единственный механизм доказательства потокабезопасности кода это JMM. 3. авторСпрашивается, зачем тогда ThreadLocal Чтобы хранить контекст связанный с потоком. Более точная формулировка есть в доке. RTFMThe ThreadLocal class in Java enables you to create variables that can only be read and written by the same thread. Нужна помощь с переводом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2017, 17:27 |
|
||
|
В чем прикол дженерика ThreadLocal
|
|||
|---|---|---|---|
|
#18+
То есть принципиальное отличие в том, что переменная класса ThreadLocal гарантированно не будет доступна для других потоков ни при каких обстоятельствах, и это поддерживается механикой JMM, а не кодом приложения. Все верно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2017, 17:37 |
|
||
|
В чем прикол дженерика ThreadLocal
|
|||
|---|---|---|---|
|
#18+
giigroТо есть принципиальное отличие в том, что переменная класса ThreadLocal гарантированно не будет доступна для других потоков Нет. Вы ерунду написали. Переменная класса ThreadLocal доступна любому потоку. Речь не о переменных, а об объектах помещенных внутрь ThreadLocal. giigroни при каких обстоятельствах Снова ерунда. Речь только о работе с объектом типа ThreadLocal. В других обстоятельствах другие потоки могут получить ссылки другими способами. giigro, и это поддерживается механикой JMM, а не кодом приложения. Все верно? Это отдельная тама. JMM это не "механика". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2017, 17:56 |
|
||
|
В чем прикол дженерика ThreadLocal
|
|||
|---|---|---|---|
|
#18+
BlazkowiczавторВ чем прикол дженерика ThreadLocal Ни в чем. Точно такой же генерик как и любой другой. Прикол есть. ThreadLocal моделирует хранение информации в потоке исполнения, при этом никак этот поток не затрагивая. Объект типа ThreadLocal<T> tl содержит в себе мапу типа Map<Thread, T> m. Когда вы пишите tl.put(v), это превращается в m.put(currentThread(), v). tl.get() обращается к m.get(currentThread()). Таким образом, хотя объект tl виден всем потокам, каждый поток может записать и прочитать туда только значение, связанное с этим потоком. Возникает иллюзия, что мы динамически расширили память текущего потока и можем в ней хранить переменную T v. Да, память потока можно расширить и расширив класс Thread, как вы сделали в своем примере. Но ваше расширение доступно только методам из этого класса (setRatio, getRatio). ThreadLocal же, будучи статической переменной, доступна методам из других классов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2017, 23:40 |
|
||
|
В чем прикол дженерика ThreadLocal
|
|||
|---|---|---|---|
|
#18+
rfq, Спасибо за исчерпывающий ответ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2017, 23:49 |
|
||
|
В чем прикол дженерика ThreadLocal
|
|||
|---|---|---|---|
|
#18+
rfqПрикол есть. ThreadLocal моделирует хранение информации в потоке исполнения, при этом никак этот поток не затрагивая. Объект типа ThreadLocal<T> tl содержит в себе мапу типа Map<Thread, T> m. Когда вы пишите tl.put(v), это превращается в m.put(currentThread(), v). tl.get() обращается к m.get(currentThread()). Не совсем так. Это Thread имеет поле threadLocalMap, что-то вроде Map<ThreadLocal, Object>. Если бы ThreadLocal хранил ссылки на Thread-ы, для которых сохранены локальные данные, то это нельзя было бы использовать из-за утечек памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2017, 11:38 |
|
||
|
В чем прикол дженерика ThreadLocal
|
|||
|---|---|---|---|
|
#18+
giigrorfq, Спасибо за исчерпывающий ответ Не спеши благодарить. Ты еще попробуй юзкейс придумай. И чтоб польза была ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2017, 00:48 |
|
||
|
В чем прикол дженерика ThreadLocal
|
|||
|---|---|---|---|
|
#18+
guest2Не совсем так. Это Thread имеет поле threadLocalMap, что-то вроде Map<ThreadLocal, Object>. Если бы ThreadLocal хранил ссылки на Thread-ы, для которых сохранены локальные данные, то это нельзя было бы использовать из-за утечек памяти. Хм, действительно так. Я когда учил, зубрил: "объект типа ThreadLocal - это ключ в мапу, локальную в Thread'е". Но со временем это забылось. А утечку памяти в варианте "ключ типа Thread" можно победить с помощью WeakReference. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2017, 00:05 |
|
||
|
В чем прикол дженерика ThreadLocal
|
|||
|---|---|---|---|
|
#18+
rfqguest2Не совсем так. Это Thread имеет поле threadLocalMap, что-то вроде Map<ThreadLocal, Object>. Если бы ThreadLocal хранил ссылки на Thread-ы, для которых сохранены локальные данные, то это нельзя было бы использовать из-за утечек памяти. Хм, действительно так. Я когда учил, зубрил: "объект типа ThreadLocal - это ключ в мапу, локальную в Thread'е". Но со временем это забылось. А утечку памяти в варианте "ключ типа Thread" можно победить с помощью WeakReference. Ни фига себе победа... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2017, 00:27 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39492562&tid=2122693]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
48ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 361ms |

| 0 / 0 |
