|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#18+
Здравствуйте! Подскажите, если в какой-то момент нужно иметь единоличный доступ одного потока к нескольким объектам, synchronized нужно использовать для каждого объекта? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
И для кадждого следующиего объекта надо будет просто добавить synchronized (object)? Код: java 1. 2. 3. 4. 5. 6. 7. 8.
Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 13:57 |
|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#18+
Краткий ответ - да. Но тут есть очень много моментов к обсуждению, почему приведенный код адское ...но. Совет 1 - прочитайте несоклько раз Java Concurrency in practice прежде чем писать ЧТО_ЛИБО связанное с многопоточностью, прочитать лучше несколько раз. Совет 2 - естсественно на 1) нужно время а задачи как-то нужно решать. В этом случае вместо приведенного решения, лучше приведите задачу, и знающие люди подскажут вам направление куда двигаться, потом уже можете выложить дизайн и его будут точечно подправлять. Теперь о том почему ваш код плох. 1) С высокой вероятностью он приведет к дедлоку, так как никто не гарантирует что локи будут вызываться в одном и том же порядке. Если их будут брать в обратном - то программе капец. 2) Ручное управление локами в принципе подвержено ошибкам, а множественные synchronize сильно бьют по перфомансу программы 3) Есть множество других решений\моделей без synchronize - начиная от Atomic\очередей\экзекьюторов до модели акторов, STM и map-reduce 4) Самый правильный совет в многопоточке - не шарить данные вообще, возможно вам просто надо пересмотреть задачу. Ну и это не говоря о таких тонких вещах как JMM, happens-before и вся остальная чертовщина ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 14:43 |
|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#18+
qi_ip, попробуй заменить одну мапу на https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html может взлетит. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 16:17 |
|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#18+
maytonqi_ip, попробуй заменить одну мапу на https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html может взлетит. очень вредный совет, без знания нутра - тыкаться в многопоточке очень опасно, и хорошо если это flowershop а не боинг ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 16:23 |
|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#18+
забыл никmaytonqi_ip, попробуй заменить одну мапу на https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html может взлетит. очень вредный совет, без знания нутра - тыкаться в многопоточке очень опасно, и хорошо если это flowershop а не боинг Пусть пробует. Совет - пересмотреть задачу - тоже хорош. Но когда человек эту задачу может себе поставить. Если ему сказали "копай от забора и до вечера" - то тут вряд-ли что-то можно смотреть. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 17:00 |
|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#18+
забыл никлучше приведите задачу, и знающие люди подскажут вам направление куда двигаться, потом уже можете выложить дизайн и его будут точечно подправлять. По задаче: есть этих два мэпа (HashMapOne и HashMapTwo). Есть два (или несколько) потоков, которые периодически обращаются к ним: получить данные по определенному элементу, добавить элемент в мэпу, удалить элемент в мэпу. То есть, есть методы: get(), add(), remove(), validate(), check() которые должны иметь актуальные данные. В основном всегда идет работа или c HashMapOne, или с HashMapTwo. И только иногда нужно блокировать сразу два списка, чтобы получить актуальные данные. Код: java 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 17:07 |
|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#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.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 17:19 |
|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#18+
Я могу свести твою задачу к работе с парой значений в качестве Value Код: java 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 17:46 |
|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#18+
maytonЯ могу свести твою задачу к работе с парой значений в качестве Value Код: java 1. 2. 3. 4.
В моем случае, не совсем подходит, так как могжет быть так, что данные есть в map_two, но нет в map_one ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 17:57 |
|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#18+
У тебя check просто будет проверять на левый и правый атрибут. Ферштейн? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 17:58 |
|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#18+
maytonУ тебя check просто будет проверять на левый и правый атрибут. Ферштейн? А обратно, по value (левый или правый) можно будет найти id? Раньше просто не юзал в такой комбинации ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 18:04 |
|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#18+
Перед мапой обычно не ставят таких задач. Можно построить мапу наоборот. Где value - это ключ. Но подумай хорошо. Тебе такое надо? Обычно поиск по неключевым атрибутам - это явно ошибочная постановка. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 18:19 |
|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#18+
Так а ты имеешь контроль над этими мапами или они сторонние? Просто сложно представить бизнес юскейс - возможно лучше переписать логику верхнего уровня, чтобы допустим маршрутизировать на новую мапу и ничего не лочить, или смержить их, или как mayton сказал. Есть ли веротяность что значения нету ни в одной из мап? Как часто обновляются значения? А вы вообще уверенно что вам такой жесткий консистенси нужен? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 18:27 |
|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#18+
Там если eventual consistency то не надо елочки из synchronized делать. Вся структура - просто отбивает короткие транзакции. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 18:36 |
|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#18+
забыл никТак а ты имеешь контроль над этими мапами или они сторонние? Да, контролировать могу. забыл никПросто сложно представить бизнес юскейс - возможно лучше переписать логику верхнего уровня, чтобы допустим маршрутизировать на новую мапу и ничего не лочить, или смержить их, или как mayton сказал Попробую пересмотреть, но пока такая логика поставлена ((( забыл никЕсть ли веротяность что значения нету ни в одной из мап? Как часто обновляются значения? Да, такая вероятность есть, могут быть пустыми обе мапы или одна из двух. забыл никА вы вообще уверенно что вам такой жесткий консистенси нужен? В целом нет, поэтому тут отписался ))))...такая структура прописана, потому что нужна четкая очередность обработки данных. Чтобы в одну мапу не записались разные из нескольких потоков. То есть, если одни поток записал значение в мапу, пока этот элемент не будет обработан, добавлять новый с таким же ID нельзя (для случая validate()). ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 20:24 |
|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#18+
qi_ip, Над двумя мапами построй API. Чтобы вставка метод был ТОЛЬКО ОДИН. И т. д. Так как межмаповые блоки это изврат. Блок ставят на метод. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 20:39 |
|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#18+
qi_ip Код: java 1. 2. 3. 4. 5.
Вот ты сам описал API. Делешь пакет с приватными двумя списками. Внешний фасад это публичный класс. У него 5 методов выше с блоками на поток. Чтобы 2 потока не зашли одновременно в метод check() ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 20:47 |
|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#18+
qi_ipИ только иногда нужно блокировать сразу два списка, чтобы получить актуальные данные.в этом вся соль задачи а ты не развернул что такое актуальные и когда иногда) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 20:54 |
|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#18+
PetroNotC Sharpqi_ipИ только иногда нужно блокировать сразу два списка, чтобы получить актуальные данные.в этом вся соль задачи а ты не развернул что такое актуальные и когда иногда) Ну, при работе двух потоков, чтобы не было такого, что пока один читал значение из мапы, другой изменил/удалил эту запись. Один прочитал, обработал значение. Отпустил мапу. Второй подключился - удалил/изменил. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 21:47 |
|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#18+
qi_ipВ целом нет, поэтому тут отписался ))))...такая структура прописана, потому что нужна четкая очередность обработки данных. Чтобы в одну мапу не записались разные из нескольких потоков. То есть, если одни поток записал значение в мапу, пока этот элемент не будет обработан, добавлять новый с таким же ID нельзя (для случая validate()). Ну вот мы и дошли до сути задачи) По факту обычный балансировщик нагрузки. Я бы просто делал хэш от ключа - и если он четный - то кладем в первую мапу, если нечетный - во вторую. и ВСЕ. Никакой синхронизации, никаких локов, никаких лишних проверок ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 21:56 |
|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#18+
ну соотвественно и при проверке читаем из мапы по ключу(чет\нечет) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 21:57 |
|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#18+
а единичную мапу сделать ConcurrentHashMap по совету mayton ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 22:01 |
|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#18+
qi_ipPetroNotC Sharpпропущено... в этом вся соль задачи а ты не развернул что такое актуальные и когда иногда) Ну, при работе двух потоков, чтобы не было такого, что пока один читал значение из мапы, другой изменил/удалил эту запись. Один прочитал, обработал значение. Отпустил мапу. Второй подключился - удалил/изменил.так. Ну а где тут вторая мапа? Нафиг она в задаче? qi_ipпрочитал, обработал значение Зачем держать мапу ПОСЛЕ ТОГО КАК ПРОЧИТАЛ? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 22:50 |
|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#18+
qi_ipОтпустил мапу. Второй подключился - удалил/изменил.мапа это таблица. Блок целиком таблицы это самое гадское от программиста 1С. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 22:54 |
|
Подскажите на счет synchronized
|
|||
---|---|---|---|
#18+
qi_ipзабыл никлучше приведите задачу, и знающие люди подскажут вам направление куда двигаться, потом уже можете выложить дизайн и его будут точечно подправлять. По задаче: есть этих два мэпа (HashMapOne и HashMapTwo). Есть два (или несколько) потоков, которые периодически обращаются к ним: получить данные по определенному элементу, добавить элемент в мэпу, удалить элемент в мэпу. То есть, есть методы: get(), add(), remove(), validate(), check() которые должны иметь актуальные данные. В основном всегда идет работа или c HashMapOne, или с HashMapTwo. И только иногда нужно блокировать сразу два списка, чтобы получить актуальные данные. Код: java 1. 2. 3. 4. 5.
Ты дал не настоящую постановку задачи. В настоящей постановке вообще нет никаких мапов. Есть балансы. Проводки. Платежи. Остатки. Вот если бы ты не фантазировал или если-бы не фантазировал твой тех-лид который придумывает брейнфаки - то мы-бы тебе вмиг сообразили красивую структуру данных. Ну не звучит... не звучит никогда от бизнеса такая задача как блокировать или не блокировать два списка. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2019, 23:27 |
|
|
start [/forum/topic.php?fid=59&msg=39852320&tid=2121153]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
171ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 255ms |
total: | 530ms |
0 / 0 |