|
|
|
Как использовать ReentrantLock вместо Synchronized в данном случае?
|
|||
|---|---|---|---|
|
#18+
Есть класс сервис и его объект в единственном экземпляре, в котором есть метод который работает в много поточной среде, в нем имеется такой код: Код: java 1. 2. 3. 4. 5. 6. 7. q - объект другого класса, их может быть множество Как можно подобное реализовать с помощью ReentrantLock или может есть какой-то другой инструмент из concurrent? Была мысль класть Локи в ConcurrentHashMap, где ключе - объекты q, а значения - локи. Но есть проблема, объекты q - мы не можем хранить в мапе вечно, надо их от туда удалять, но нужно будет выполнять на них .unlock() и .remove() - это две операции, в итоге другой поток в промежуток между ними может начать работать со своим, вторым, локом. Можно было бы сделать поле AromicInteger но не хочется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 11:24:06 |
|
||
|
Как использовать ReentrantLock вместо Synchronized в данном случае?
|
|||
|---|---|---|---|
|
#18+
MaxNevermindКак можно подобное реализовать с помощью ReentrantLock или может есть какой-то другой инструмент из concurrent? https://www.google.com/search?q=ReentrantLock По любой ссылке есть пример. Что вызывает сложности? MaxNevermindМожно было бы сделать поле AromicInteger но не хочется. Это ещё почему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 11:38:44 |
|
||
|
Как использовать ReentrantLock вместо Synchronized в данном случае?
|
|||
|---|---|---|---|
|
#18+
[quot Blazkowicz]MaxNevermindКак можно подобное реализовать с помощью ReentrantLock или может есть какой-то другой инструмент из concurrent? https://www.google.com/search?q=ReentrantLock По любой ссылке есть пример. Что вызывает сложности? Везде - простые примеры блокировки самого объекта в котором выполняется .lock(), у меня не этот случай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 11:56:12 |
|
||
|
Как использовать ReentrantLock вместо Synchronized в данном случае?
|
|||
|---|---|---|---|
|
#18+
MaxNevermind Код: java 1. 2. 3. 4. 5. 6. 7. А ещё ваш код это прямое нарушение инкапсуляции. Его целиком и полностью можно унести внутрь класса переменной Q и тогда проблема с хранением лока уйдёт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 12:10:16 |
|
||
|
Как использовать ReentrantLock вместо Synchronized в данном случае?
|
|||
|---|---|---|---|
|
#18+
MaxNevermindВезде - простые примеры блокировки самого объекта в котором выполняется .lock(), у меня не этот случай. synchronized это и есть .lock() не вижу разницы. Теперь разобрался что вам сам Lock хранить негде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 12:11:08 |
|
||
|
Как использовать ReentrantLock вместо Synchronized в данном случае?
|
|||
|---|---|---|---|
|
#18+
Блокировка ради инкремента... Чем атомик-то не устроил, самое место ему тут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 12:11:24 |
|
||
|
Как использовать ReentrantLock вместо Synchronized в данном случае?
|
|||
|---|---|---|---|
|
#18+
ivanraБлокировка ради инкремента... Чем атомик-то не устроил, самое место ему тут Да, есть такие программисты, которым лишь бы всё усложнить. ConcurrentHashMap ещё сверху навернуть чтобы Lock хранить... Хотя весь такой код выкидывается и заменяется на 2 строчки правильныого кода в правильном месте. Было у меня как-то, дал коллеге задачу, получили в результате метод на полтора экрана в высоту. Переписал потом этот метод в 4 строки кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 12:14:16 |
|
||
|
Как использовать ReentrantLock вместо Synchronized в данном случае?
|
|||
|---|---|---|---|
|
#18+
ivanraБлокировка ради инкремента... Чем атомик-то не устроил, самое место ему тут Но есть же случаи в которых q.getVotes() будет вызываться и без последующего приращения? Я думал логично синхронизировать только ту часть где возможны проблемы, а не делать поле Atomic для всех объектов-юзеров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 13:23:25 |
|
||
|
Как использовать ReentrantLock вместо Synchronized в данном случае?
|
|||
|---|---|---|---|
|
#18+
MaxNevermindНо есть же случаи в которых q.getVotes() будет вызываться и без последующего приращения? И что? По-вашему атомики этого не позволяют? MaxNevermindЯ думал логично синхронизировать только ту часть где возможны проблемы, а не делать поле Atomic для всех объектов-юзеров. Странный критерий "возможны проблемы". Есть критический ресурс. Доступ к нему нужно синхронизировать. Если всё сводится к инкременту-чтению-записи, то AtomicInteger просто создан для этого? Зачем изобретать что-то? По-вашему вы получите нереальный прирост производительности, если вместо AtomicInteger.get() будете использовать прямой доступ к int полю? Или что вас смущает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 13:29:55 |
|
||
|
Как использовать ReentrantLock вместо Synchronized в данном случае?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczПо-вашему вы получите нереальный прирост производительности, если вместо AtomicInteger.get() будете использовать прямой доступ к int полю? Или что вас смущает? Ну в общем да. Ну понятно, что не нереальный, но какой-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 14:47:08 |
|
||
|
Как использовать ReentrantLock вместо Synchronized в данном случае?
|
|||
|---|---|---|---|
|
#18+
MaxNevermindЕсть класс сервис и его объект в единственном экземпляре, в котором есть метод который работает в много поточной среде, в нем имеется такой код: Код: java 1. 2. 3. 4. 5. 6. 7. q - объект другого класса, их может быть множество Как можно подобное реализовать с помощью ReentrantLock или может есть какой-то другой инструмент из concurrent? Была мысль класть Локи в ConcurrentHashMap, где ключе - объекты q, а значения - локи. Но есть проблема, объекты q - мы не можем хранить в мапе вечно, надо их от туда удалять, но нужно будет выполнять на них .unlock() и .remove() - это две операции, в итоге другой поток в промежуток между ними может начать работать со своим, вторым, локом. Можно было бы сделать поле AromicInteger но не хочется. Код: java 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 14:51:48 |
|
||
|
Как использовать ReentrantLock вместо Synchronized в данном случае?
|
|||
|---|---|---|---|
|
#18+
MaxNevermindBlazkowiczПо-вашему вы получите нереальный прирост производительности, если вместо AtomicInteger.get() будете использовать прямой доступ к int полю? Или что вас смущает? Ну в общем да. Ну понятно, что не нереальный, но какой-то. Ну, какой-то такой, близкий к нулю, в общем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 14:54:48 |
|
||
|
Как использовать ReentrantLock вместо Synchronized в данном случае?
|
|||
|---|---|---|---|
|
#18+
Atum1MaxNevermindЕсть класс сервис и его объект в единственном экземпляре, в котором есть метод который работает в много поточной среде, в нем имеется такой код: Код: java 1. 2. 3. 4. 5. 6. 7. q - объект другого класса, их может быть множество Как можно подобное реализовать с помощью ReentrantLock или может есть какой-то другой инструмент из concurrent? Была мысль класть Локи в ConcurrentHashMap, где ключе - объекты q, а значения - локи. Но есть проблема, объекты q - мы не можем хранить в мапе вечно, надо их от туда удалять, но нужно будет выполнять на них .unlock() и .remove() - это две операции, в итоге другой поток в промежуток между ними может начать работать со своим, вторым, локом. Можно было бы сделать поле AromicInteger но не хочется. Код: java 1. 2. 3. 4. 5. 6. 7. 8. и что произойдет если между result.putIfAbsent(element, new AtomicInteger(0)); //useful method that exists only in concurrent maps и result.get(element).incrementAndGet(); будет вызван result.remove(element) как я указал в первом посте? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 16:01:04 |
|
||
|
Как использовать ReentrantLock вместо Synchronized в данном случае?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, то есть если соотношение операций 1 \ 10 - просто чтение \ чтение с изменением, то все равно лучше сделать через atomicInteger? synchronized на столько дороже atomicInteger? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 16:03:55 |
|
||
|
Как использовать ReentrantLock вместо Synchronized в данном случае?
|
|||
|---|---|---|---|
|
#18+
MaxNevermindто есть если соотношение операций 1 \ 10 - просто чтение \ чтение с изменением, то все равно лучше сделать через atomicInteger? Конечно. MaxNevermindsynchronized на столько дороже atomicInteger? Если потоков больше одного, то на очень много: 15284476 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 16:05:45 |
|
||
|
Как использовать ReentrantLock вместо Synchronized в данном случае?
|
|||
|---|---|---|---|
|
#18+
MaxNevermindи что произойдет если между result.putIfAbsent(element, new AtomicInteger(0)); //useful method that exists only in concurrent maps и result.get(element).incrementAndGet(); будет вызван result.remove(element) как я указал в первом посте? сложно по куску Вашего кода понять что вы хотите сотворить ???!!! возможно Вам нужен ThreadLocal в каждом классе или AtomicReference Решать Вам. http://www.sql.ru/forum/1051995-1/test-synchronized-vs-reentrantlock ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 16:40:58 |
|
||
|
Как использовать ReentrantLock вместо Synchronized в данном случае?
|
|||
|---|---|---|---|
|
#18+
Ясно. Всем спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 17:39:46 |
|
||
|
Как использовать ReentrantLock вместо Synchronized в данном случае?
|
|||
|---|---|---|---|
|
#18+
Atum1 Код: java 1. 2. 3. 4. 5. 6. 7. 8. Это шутка такая? :-) Создавать локальный конкурентный мап, запихивать в него атомики, а потом еще и у putIfAbsent не проверять результат - это за гранью добра и зла. Ваш пример решается вот так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 20:53:40 |
|
||
|
Как использовать ReentrantLock вместо Synchronized в данном случае?
|
|||
|---|---|---|---|
|
#18+
cdtyjvЭто шутка такая? :-) Создавать локальный конкурентный мап, запихивать в него атомики, а потом еще и у putIfAbsent не проверять результат - это за гранью добра и зла. Ваш пример решается вот так: я ничего не понял :)но пусть будет так . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 22:34:51 |
|
||
|
Как использовать ReentrantLock вместо Synchronized в данном случае?
|
|||
|---|---|---|---|
|
#18+
Atum1 , Ну скажем так, за тот код, что вы привели выгонят с любого собеседования, если это не джуниор позиция. Причины три: 1) Вы создали ConcurrentHashMap с которой может работать только один поток. 2) Вы работаете с локальным атомиками опять таки в однопоточном коде. 3) Вы вызываете putIfAbsent, но не смотрите на его результат. Собственно, что полезного мог почерпнуть из этого кода ТС, непонятно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 22:39:57 |
|
||
|
Как использовать ReentrantLock вместо Synchronized в данном случае?
|
|||
|---|---|---|---|
|
#18+
cdtyjv Atum1 , Ну скажем так, за тот код, что вы привели выгонят с любого собеседования, если это не джуниор позиция. Причины три: 1) Вы создали ConcurrentHashMap с которой может работать только один поток. 2) Вы работаете с локальным атомиками опять таки в однопоточном коде. 3) Вы вызываете putIfAbsent, но не смотрите на его результат. ну да - просто ради того чтобы не расписывать Код: java 1. 2. 3. 4. 5. :) Собственно, что полезного мог почерпнуть из этого кода ТС, непонятно :) -> ему только одному известно : Код: java 1. 2. 3. 4. 5. 6. 7. с таким же успехом можно было обернуть все это в Lock вместо synchronized ? или оставить как есть ? чем плохо такое решение ? это узкое горло? там идет большая конкуренция за ресурс , этот код в каком то синглетоне ?... вопросы можно продолжать ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 22:51:21 |
|
||
|
Как использовать ReentrantLock вместо Synchronized в данном случае?
|
|||
|---|---|---|---|
|
#18+
MaxNevermind, Если у вас есть возможность изменить класс объекта q, то можно вашу задачу решить вот так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Использовать можно вот так (вместо synchronized и ReentrantLock): Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2013, 00:55:18 |
|
||
|
Как использовать ReentrantLock вместо Synchronized в данном случае?
|
|||
|---|---|---|---|
|
#18+
MaxNevermindBlazkowiczПо-вашему вы получите нереальный прирост производительности, если вместо AtomicInteger.get() будете использовать прямой доступ к int полю? Или что вас смущает? Ну в общем да. Ну понятно, что не нереальный, но какой-то. А вы учли, что при чтении без синхронизации вы скорее всего теряете видимость изменений? Например, поле инкрементировалось 10 раз, а getVotes() вам вернет только 5 (в этом случае вооще getVotes вне синхронизированнхы блоков можно на return 0 заменить, может быть консистентно с вашей моделью программы). Я не утверждаю, что так будет. Но чтобы так не было, требуются специальные действия. На этом фоне AtomicInteger заметных проблем с производительностью не даст (и при этом он обеспечивает видимость изменений). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2013, 10:07:46 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=194&tid=2127951]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
25ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 355ms |

| 0 / 0 |
