powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Синхронизация по String
11 сообщений из 36, страница 2 из 2
Синхронизация по String
    #37736098
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ещё, расскажи, если не трудно, для чего true/false. Не проще ли через Set и проверку на null?
...
Рейтинг: 0 / 0
Синхронизация по String
    #37736219
OOsalivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczBlazkowiczАаа, там предыдущее значение выталкивается. Я подумал что флаг. А NPE не будет ли при анбоксинге null? В любом случае при первом заходе там всегда не true. Рантайм в цикл вообще не попадёт.
Ой, блин что-то я гоню. Это же только для того случая если строка есть.
А ещё вопрос, все ведь строки на одном локе висят. Тогда если две разных строки в 2х потоках уже существуею, они ещё и с друг другом будут бодаться за lock?

Когда поток переходит в состояние wait он освобождает монитор объекта.
Поэтому все строки которые соответствуют
map.put(s, true) == true - т.е предыдущее значение для данного ключа(строки) == true - будут переходить в состояние wait.
...
Рейтинг: 0 / 0
Синхронизация по String
    #37736247
OOsalivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczИ ещё вопрос к коду. Как отработает re-entrancy, если метод вызовется для той же строки, но в том же потоке?

Когда поток вызывает lock.notifyAll(); он переводит все потоки(которые висят на данном локе) в активное состояние. Если у нас есть стек потоков с одним ключом (s) которые на момент lock.notifyAll() висели на нашем локе - то первый из них выигрывает ресурс map.put(s, true) == false и работает с критической областью, а остальные по условию map.put(s, true) == true переходят в состояние wait.
...
Рейтинг: 0 / 0
Синхронизация по String
    #37736260
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
notifyAll() тоже ведь завернуть нужно в synchronized
...
Рейтинг: 0 / 0
Синхронизация по String
    #37736269
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OOsalivanКогда поток вызывает lock.notifyAll(); он переводит все потоки(которые висят на данном локе) в активное состояние. Если у нас есть стек потоков с одним ключом (s) которые на момент lock.notifyAll() висели на нашем локе - то первый из них выигрывает ресурс map.put(s, true) == false и работает с критической областью, а остальные по условию map.put(s, true) == true переходят в состояние wait.
Нее, re-entrancy, это про один поток. Если вдруг поток вызовет метод, положит строку и потом в какой-то момент снова вызовет этот же метод. Он же залочится до тех пор пока кто-то по другой строке его не разбудит.
...
Рейтинг: 0 / 0
Синхронизация по String
    #37736344
OOsalivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczА ещё, расскажи, если не трудно, для чего true/false. Не проще ли через Set и проверку на null?
Можно и через Set - только какую имплиминтацию брать?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
   private final Object lock = new Object();
    private final Set<String> set = new //Concurrent implementation;

    void someMethod(String s) throws InterruptedException {
        synchronized (lock) {
            while (set.add(s) != true) {
                lock.wait();
            }
        }
        // синхронизированный код
        set.remove(s);
        synchronized (lock) {
            lock.notifyAll();
        }
    }
...
Рейтинг: 0 / 0
Синхронизация по String
    #37736357
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OOsalivanМожно и через Set - только какую имплиминтацию брать?

Collections.newSetFromMap()
...
Рейтинг: 0 / 0
Синхронизация по String
    #37736479
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczLock рекомедуют к использованию вместо wait/notify. Но мне любопытно на счет производительности. Lock устроен горзда сложнее с кучей вызовов методов.

Насчет производительности - многое зависит от имплементации JVM, но если брать HotSpot, то рекомендуют использовать synchronized в случае если с кодом работает в основном один поток, причем если синхронизация происходит все время по одному объекту(так как возможно применить так называемый biased locking), в данном случае это не наблюдается. Вариант когда с кодом работает один поток, но синхронизация по разным объектам и количество "столкновений на мониторе" невысоко, то оба подхода дают примерно одинаковый результат, так как оба работают на CASе, а вот выигрывать Lock начинает при большом столкновении, так как synch сразу раздувается до OS-level монитора, а Lock имплементирован так, что может адаптивно подстраиваится, и перейти на OS-level и обратно при определенных условиях. Все это более подробно описывается тут - http://www.javaspecialist.ru/2011/11/synchronized-vs-reentrantlock.html#more

BlazkowiczА ещё вопрос, все ведь строки на одном локе висят. Тогда если две разных строки в 2х потоках уже существуею, они ещё и с друг другом будут бодаться за lock?
И ещё вопрос к коду. Как отработает re-entrancy, если метод вызовется для той же строки, но в том же потоке?

Вот именно поэтому я и говорю, что надо использовать ReentrantLock, причем он должен быть не глобальным, а содержаться в Map

Код: java
1.
private final ConcurrentMap<String, ReentrantLock> map = new ConcurrentHashMap<String, ReentrantLock>();



и лочить надо именно не глобальный лок, а тот что доступен по ключу-строке, тогда столкновений на разных строках на одном мониторе не будет, что значительно увеличит производительность, как вы и заметили.
...
Рейтинг: 0 / 0
Синхронизация по String
    #37736498
OOsalivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНее, re-entrancy, это про один поток. Если вдруг поток вызовет метод, положит строку и потом в какой-то момент снова вызовет этот же метод. Он же залочится до тех пор пока кто-то по другой строке его не разбудит.

Ну а в случае с обычной синхронизацией (через синхронайз) что произойдет? Это по моему общая проблема
...
Рейтинг: 0 / 0
Синхронизация по String
    #37736541
OOsalivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никBlazkowiczА ещё вопрос, все ведь строки на одном локе висят. Тогда если две разных строки в 2х потоках уже существуею, они ещё и с друг другом будут бодаться за lock?
И ещё вопрос к коду. Как отработает re-entrancy, если метод вызовется для той же строки, но в том же потоке?

Вот именно поэтому я и говорю, что надо использовать ReentrantLock, причем он должен быть не глобальным, а содержаться в Map

Так какую проблему решает ReentrantLock по отношению к Object.wait ?
Object.wait просто переводит поток в состояние ожидания, и из- за того что этот метод релизит монитор после перевода, то может использоваться сколько угодно
...
Рейтинг: 0 / 0
Синхронизация по String
    #37737086
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shainsky
Я придумал такой код, но есть подозрения в том, что он неоптимален:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 

    static ConcurrentMap<String, String> workWith = new ConcurrentHashMap<String, String>();
         ...
        
    void someMethod(String s) {

        String current = workWith.putIfAbsent(s, s);
        if (current == null)
            current = s;
        synchronized (current) {

         // синхронизированный код ...

            workWith.remove(s);
        }
    }



Строка workWith.remove(s); лишняя, в случае, если потоков будет больше двух и они параллельно будут вызывать этот метод, то есть вероятность, что второй и третий потоки зайдут одновременно в синхронизированный блок.
...
Рейтинг: 0 / 0
11 сообщений из 36, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Синхронизация по String
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]