|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#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.
касательно этих двух полей, вроде все потокобезопасно в этом классе? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 18:25 |
|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#18+
rabiterДрузья, что-то я перегрелся, развейте мои страхи! Так же безопасно (упростил, но суть такая же)? [src java] class final SomeName { private volatile String string = ""; а ты знаешь что класс String имутабелен и является сам по себе потокобезопасным? рано тебе еще в многопоточку дядя java core нужно подучить,я как раз тесты сделал,если хочешь будешь первым пациентом))) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 18:59 |
|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#18+
asv79, Мне кажется, что тут больше вопрос к Map. https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.5 - по JMM да, потокобезопасно. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 19:07 |
|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#18+
asv79rabiterДрузья, что-то я перегрелся, развейте мои страхи! Так же безопасно (упростил, но суть такая же)? [src java] class final SomeName { private volatile String string = ""; а ты знаешь что класс String имутабелен и является сам по себе потокобезопасным? рано тебе еще в многопоточку дядя java core нужно подучить,я как раз тесты сделал,если хочешь будешь первым пациентом))) уважаемый, пню понятно, что String иммутабельный, я для примера его и привел (в реальном примере у меня свой иммутабельный класс на его месте). ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 19:12 |
|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#18+
Lelouchasv79, Мне кажется, что тут больше вопрос к Map. https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.5 - по JMM да, потокобезопасно. да, вопрос больше про мап, да я что-то перегорелся. вроде правильно публикую, так что все должно быть ок. Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 19:14 |
|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#18+
asv79rabiterДрузья, что-то я перегрелся, развейте мои страхи! Так же безопасно (упростил, но суть такая же)? [src java] class final SomeName { private volatile String string = ""; а ты знаешь что класс String имутабелен и является сам по себе потокобезопасным? рано тебе еще в многопоточку дядя java core нужно подучить,я как раз тесты сделал,если хочешь будешь первым пациентом))) не ну вот откуда такие как ты лезут вообще? что за манера? ужас просто ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 19:16 |
|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#18+
rabiter не ну вот откуда такие как ты лезут вообще? что за манера? ужас просто Код: java 1. 2.
вот твой код вот твой вопрос @касательно этих двух полей, вроде все потокобезопасно в этом классе? что еще ты ожидал услышать ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 19:36 |
|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#18+
asv79rabiterне ну вот откуда такие как ты лезут вообще? что за манера? ужас просто Код: java 1. 2.
вот твой код вот твой вопрос @касательно этих двух полей, вроде все потокобезопасно в этом классе? что еще ты ожидал услышать ну ладно ладно, не обижайся! просто как я сюда не зайду, все что угодно, но не по делу! так вот, там масса всего может быть непотокобезопасно. Например, если бы я map заполнял в конструкторе из внешней мапы, которая пришла бы параметром в конструктор. Или вообще, если бы по ссылке ее в конструкторе присвоил! или если бы у меня this из конструктора утекло! Или volatile бы у string не поставил. Вообщем вариантов накосячить тьма! Я же с многопоточкой сталкиваюсь редко (энтерпрайз, все уже синхронизировано до нас). Конечно java concurrency in practice читал пару раз, но за неиспользованностью ньансы забываются! остается только тревожность и постоянная настороженность со всем, что касается многопоточки. А вы по двум строчкам диагноз ставите! Ет самое того, не надо так ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 19:49 |
|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#18+
rabiter ну ладно ладно, не обижайся! просто как я сюда не зайду, все что угодно, но не по делу! [/quot] а это нормально) кому охота после рабочего дня ковыряться в чужом коде) вот погавкаться-мы за ) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 19:54 |
|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#18+
asv79, ну, кстати, с HashMap не все так очевидно. Мы же не знаем, какие она там внутренние перестановки делает при get (ну на самом деле знаем, ничего она при get не делает такого). Но чисто теоретически, если поставить на место map какой-нибудь свой mutable класс, то не все уже будет так очевидно ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 21:51 |
|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#18+
Попахивает нарушением S из SOLID. Поля както не зависят друг от друга. Поэтому сложно сказать о потокобезопасности. Какие еще операции есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 23:00 |
|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#18+
забыл никПопахивает нарушением S из SOLID. Поля както не зависят друг от друга. Поэтому сложно сказать о потокобезопасности. Какие еще операции есть? попахивает, но это для примера. Вообще я за SOLID, и ещё знаете что? Принципы питона, ну прямо то, к чему я сам пришёл, а потом прочитал их и да - все так и есть! невероятная радость) этот класс - это просто пример, мне было интересно, потокобезопасно ли себя ведёт HashMap в таком виде, или менять на ConcurrentHashMap. ну а string, кстати можно же volatile String заменить на AtomicReference<String> убрав volatile? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 23:13 |
|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#18+
rabiter, Больше тебе ничего не надо знать по сути твоего вопроса: https://stackoverflow.com/a/33351133/2674303 https://stackoverflow.com/a/33351133/2674303 So, multiple threads will call the fetch method, which delegates to HashMap.get() without any synchronization. HashMap is not thread-safe. Bam, end of story. P.S. обратите внимание на автора ответа ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 23:22 |
|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#18+
rabiter, Код: java 1.
А зачем ты это вообще включил в вопрос если вопрос про HashMap? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 23:24 |
|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#18+
rabiterДрузья, что-то я перегрелся, развейте мои страхи! Так же безопасно (упростил, но суть такая же)? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
касательно этих двух полей, вроде все потокобезопасно в этом классе? В общем случае нет. Если инстанс SomeName расшаривается без хэппенс бефор, то нет никаких гарантий на видимость двух элементов которые добавлены в конструкторе. Если "с" то final тут роль играет больше как const. Если уж намеренно необходимо расшаривать без hb, то в мапу надо сначала класть элементы и только потом присваивать ее финал полю. Делается это либо через временную переменную, либо через анонимный класс с инстанс инициализацией {}. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 23:28 |
|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#18+
no56892rabiterДрузья, что-то я перегрелся, развейте мои страхи! Так же безопасно (упростил, но суть такая же)? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
касательно этих двух полей, вроде все потокобезопасно в этом классе? В общем случае нет. Если инстанс SomeName расшаривается без хэппенс бефор, то нет никаких гарантий на видимость двух элементов которые добавлены в конструкторе. Если "с" то final тут роль играет больше как const. Если уж намеренно необходимо расшаривать без hb, то в мапу надо сначала класть элементы и только потом присваивать ее финал полю. Делается это либо через временную переменную, либо через анонимный класс с инстанс инициализацией {}. Freeze для final полей вызывается после вызова конструктора, так что по идее все изменения будут видны. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 23:43 |
|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#18+
no56892, https://m.habr.com/ru/post/133981/comments/#comment_4455280 А ваш комментарий относится к volatile ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 23:49 |
|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#18+
Lelouch, Дружище, ты даже не читаешь то, на что оставляешь ссылки. Посмотри повнимательней пример 17.5-1 из нее. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2019, 23:59 |
|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#18+
no56892, Посмотрел, да, freeze работает для final полей. Понятно что y не гарантируется. При чем тут пример тс? А вы посмотрите https://shipilev.net/talks/codefest-Mar2014-jmm-pragmatics.pdf шипилевЕсли поток прочитал из final-поля ссылку на другой объект, то состояние того как минимум настолько же свежее, как и на время freeze Слайд finals:решение Поэтому, если в конструкторе this не утекает, как у тс, то все норм. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2019, 00:05 |
|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#18+
no56892, То есть, насколько я вижу: - для final полей hb это завершение конструктора и чтение ссылки на созданный объект - для volatile hb это запись->чтение ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2019, 00:18 |
|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#18+
questionerобратите внимание на автора ответа обрати внимание на пример там и тут. Там мапа модифицируется, тут readonly ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2019, 00:20 |
|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#18+
chpashaquestionerобратите внимание на автора ответа обрати внимание на пример там и тут. Там мапа модифицируется, тут readonly А теперь прочитай что по той ссылке написано и удивись ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2019, 00:39 |
|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#18+
chpashaquestionerобратите внимание на автора ответа обрати внимание на пример там и тут. Там мапа модифицируется, тут readonly Brian Goetz(Also, you probably think that HashMap.get() is a pure read operation, but that's wrong too. What if the HashMap is actually a LinkedHashMap (which is a subclass of HashMap.) LinkedHashMap.get() will update the access order, which involves writing to internal data structures -- here, concurrently without synchronization. But even if get() is doing no writing, your code here is still broken.) Так что не надо выпендриваться. Но всё что нужно знать я уже скопировал ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2019, 00:41 |
|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#18+
questioner, В вашем примере put и get выполняются без синхронизации (1е чтение) и именно поэтому при вызове .get мы можем получить что угодно. Поэтому этот пример и не работает. Упоминание LinkedHashMap полезено только с точки зрения того, что без исходников мы не можем сказать, изменяет ли состояние вызов метода. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2019, 00:59 |
|
HashMap на чтение несколькими потоками
|
|||
---|---|---|---|
#18+
no56892, Выдержка из jls: then when the object is seen by another thread, that thread will always see the correctly constructed version of that object's final fields. It will also see versions of any object or array referenced by those final fields that are at least as up-to-date as the final fields are. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2019, 01:16 |
|
|
start [/forum/topic.php?fid=59&msg=39870887&tid=2121088]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
181ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 308ms |
0 / 0 |