|
|
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
Кто подскажет шаблон для синхронизации кода не по экземпляру объекта, а по строке? То есть чтобы одновременные вызовы someMethod("a") и someMethod("b") выполнялись параллельно, а вызовы someMethod("a") и someMethod("a") - по очереди. Я придумал такой код, но есть подозрения в том, что он неоптимален: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 18:13:18 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
А чего вы хотите добиться? Я имею ввиду, что возможно вы идете окружным путем, а решение проще и элегантней. Что касается того кода что вы привели, выполнить какой-то код, основываясь на параметре, то да, можно завести коллекцию, не обязательно ConcurrentHashMap, в цикле делать CAS, ожидая пока ячейка освободиться, и когда освободиться выполнить свой код, Только опять же иногда CAS намного хуже чем обычный Lock, если contention большой. Можете описать задачу конкретней? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 18:38:15 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
Я так полагаю что это какое-то подобие кэша, который поддерживает работу с несколькими потоками? Тогда вам определенно надо скачать Java Concurrency in practice, там целая глава посвящена кэшам, и есть там хороший пример с Future и Computable ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 18:40:54 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
забыл ник, Это не подобие хэша. Я пишу обработчик вызовов удаленного метода. У меня есть некая сущность, скажем, клиентский счет. Он идентифицируется строковым UUID'ом. Таких сущностей на сервере может быть несколько тысяч. Мне надо делать синхронизацию на основе UUID'а. Чтобы два клиента одновременно не редактировали одновременно эту сущность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 19:12:09 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
Во-первых, я не очень понимаю, зачем нужна проверка на null. Во-вторых, что из себя представляет эта сущность? Если это объект внутри JVM, то синхронизируйтесь прям на нем. Если это строчка в базе данных, то захватывайте лок на этой строчке в БД (это происходит автоматически при update или delete). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 19:26:39 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
авторВо-вторых, что из себя представляет эта сущность? Если это объект внутри JVM, то синхронизируйтесь прям на нем. Если это строчка в базе данных, то захватывайте лок на этой строчке в БД (это происходит автоматически при update или delete). Я тоже так думаю, может топикстартер чего-то недоговаривает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 19:30:52 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
Йуный джавистЪВо-первых, я не очень понимаю, зачем нужна проверка на null. Почитайте джавадок метода ConcurrentMap.putIfAbsent() Йуный джавистЪВо-вторых, что из себя представляет эта сущность? Если это объект внутри JVM, то синхронизируйтесь прям на нем. Спасибо, кэп! :) Йуный джавистЪЕсли это строчка в базе данных, то захватывайте лок на этой строчке в БД (это происходит автоматически при update или delete). Это сущность в нереляционном дата-бэкенде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 19:32:58 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
забыл никавторВо-вторых, что из себя представляет эта сущность? Если это объект внутри JVM, то синхронизируйтесь прям на нем. Если это строчка в базе данных, то захватывайте лок на этой строчке в БД (это происходит автоматически при update или delete). Я тоже так думаю, может топикстартер чего-то недоговаривает? Это сущность в самописном нереляционном дата-бэкенде. У меня нет уверенности в корректной поддержке конкурентной модификации сущностей внутри этого бэкенда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 19:41:35 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
Почитайте джавадок метода ConcurrentMap.putIfAbsent() Теперь понял. Это сущность в нереляционном дата-бэкенде. Можно поинтересоваться, в каком? Даже в файловой системе есть локи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 19:41:49 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
Это сущность в нереляционном дата-бэкенде. Можно поинтересоваться, в каком? Даже в файловой системе есть локи. Кэширующее реплицируемое хранилище игровых объектов. По сути легаси-система, написана на С++. Используется в многопользовательской игре. Количество типов объектов ограничено и заранее описано. Не знаю, что ещё рассказать Вам о нем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 19:50:14 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
shainsky, Кладите вместо строки либо просто новый созданный объект, либо какую-нибудь из реализаций java.util.concurrent.locks.Lock ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 20:02:49 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
schwashainsky, Кладите вместо строки либо просто новый созданный объект, либо какую-нибудь из реализаций java.util.concurrent.locks.Lock Вместо current = s написать current = new Object() ? А в чем здесь оптимизация? В моем случае кладется уже существующий объект, а в Вашем - новый, который надо создавать и хранить. Или я неправильно понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 20:11:14 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
Вы не то оптимизируете - вам нужно оптимизировать время пребывания в блоке synchronized и количество тех, кто борется за это монитор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 20:28:34 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
За этоТ монитор, который создается, или достается из мапа, а вы боритесь с GC вместо этого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 20:30:18 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
intern() но это не очень здорово, поэтому проще создать Код: java 1. 2. 3. 4. 5. 6. и синхронизироваться по нему ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 23:40:58 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
shainsky, Еще вариант Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2012, 00:02:28 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
OOsalivanshainsky, Еще вариант Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Зачем эта мутотень если уже 5 лет есть Lock? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2012, 02:15:51 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
забыл никЗачем эта мутотень если уже 5 лет есть Lock? Lock есть, и как вы его собираетесь к этой задаче применить, где ваш код? Или это самоутверждение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2012, 10:23:27 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
schwaВы не то оптимизируете - вам нужно оптимизировать время пребывания в блоке synchronized и количество тех, кто борется за это монитор. +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2012, 10:29:14 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
OOsalivanshainsky, Еще вариант Код: java 1. 2. 3. 4. 5. Как на счет spurious wakeup? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2012, 10:29:47 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
OOsalivanLock есть, и как вы его собираетесь к этой задаче применить, где ваш код? Или это самоутверждение? Всё тоже самое, только вместо Object - Lock и synchronized не нужен. Lock рекомедуют к использованию вместо wait/notify. Но мне любопытно на счет производительности. Lock устроен горзда сложнее с кучей вызовов методов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2012, 10:33:17 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
BlazkowiczOOsalivanshainsky, Еще вариант Код: java 1. 2. 3. 4. 5. Как на счет spurious wakeup? А где вы видите проблему с spurious wakeup? while (map.put(s, true) == true) - как раз для этого и написано ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2012, 12:13:19 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
OOsalivanА где вы видите проблему с spurious wakeup? while (map.put(s, true) == true) - как раз для этого и написано Ааа, там предыдущее значение выталкивается. Я подумал что флаг. А NPE не будет ли при анбоксинге null? В любом случае при первом заходе там всегда не true. Рантайм в цикл вообще не попадёт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2012, 12:24:20 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
BlazkowiczАаа, там предыдущее значение выталкивается. Я подумал что флаг. А NPE не будет ли при анбоксинге null? В любом случае при первом заходе там всегда не true. Рантайм в цикл вообще не попадёт. Ой, блин что-то я гоню. Это же только для того случая если строка есть. А ещё вопрос, все ведь строки на одном локе висят. Тогда если две разных строки в 2х потоках уже существуею, они ещё и с друг другом будут бодаться за lock? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2012, 12:26:08 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37736077&tid=2132140]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
28ms |
get topic data: |
13ms |
get forum data: |
4ms |
get page messages: |
78ms |
get tp. blocked users: |
2ms |
| others: | 343ms |
| total: | 503ms |

| 0 / 0 |
