Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / synchronizedMap.безопасно ли сначала взять итератор в несинхронизованном, а читать в синхр / 7 сообщений из 7, страница 1 из 1
26.05.2014, 17:07
    #38652334
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
synchronizedMap.безопасно ли сначала взять итератор в несинхронизованном, а читать в синхр
Заинтересовался sync коллекциями.
прочитал статью:
http://dev-things.blogspot.ru/2011/03/synchronizedmap-and-concurrenthashmap.html?showComment=1401108193889#c3972341173079778332

Не уловил почему " Needn't be in synchronized block"
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
Map m = Collections.synchronizedMap(new HashMap());
     ...
Set s = m.keySet();  // Needn't be in synchronized block
...
synchronized(m) {  // Synchronizing on m, not s!
    Iterator i = s.iterator(); // Must be in synchronized block
    while (i.hasNext())
          foo(i.next());
}



Поясните пожалуйста.
...
Рейтинг: 0 / 0
26.05.2014, 19:07
    #38652473
DEVcoach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
synchronizedMap.безопасно ли сначала взять итератор в несинхронизованном, а читать в синхр
redwhite90 ,
Откройте класс Collections , и посмотрите на реализацию этого метода. Если вы понимаете, как работает synchronized, вопрос должен отпасть сам собой. Если не понимаете - сначала ознакомьтесь с synchronized, а потом переходите к коллекциям.
...
Рейтинг: 0 / 0
26.05.2014, 19:26
    #38652488
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
synchronizedMap.безопасно ли сначала взять итератор в несинхронизованном, а читать в синхр
DEVcoach,
DEVcoachОткройте класс Collections, и посмотрите на реализацию этого метода

посмотрел. Да знаю, что тупо все методы завернуты в sync секцию

DEVcoachЕсли вы понимаете, как работает synchronized
понимаю
...
Рейтинг: 0 / 0
26.05.2014, 19:52
    #38652508
DEVcoach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
synchronizedMap.безопасно ли сначала взять итератор в несинхронизованном, а читать в синхр
redwhite90 ,
А итератор завернут? :-) Ведь для работы с ним надо постоянно вызывать разные его методы - hasNext(), next(), и т.д.. По отдельности они синхронизированы, а в компексе - нет. Поэтому вы легко можете словить тот же ConcurrentModificationException, если не будете итерироваться внутри synchronized-блока.
...
Рейтинг: 0 / 0
26.05.2014, 21:30
    #38652561
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
synchronizedMap.безопасно ли сначала взять итератор в несинхронизованном, а читать в синхр
DEVcoach,
Если я правильно понял, то вызывается именно этот метод:

Код: java
1.
2.
3.
 public Iterator<E> iterator() {
            return c.iterator(); // Must be manually synched by user!
        }




а вот места где методы итератора хотя бы по одному синхронизованы в упор не вижу
...
Рейтинг: 0 / 0
26.05.2014, 21:38
    #38652564
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
synchronizedMap.безопасно ли сначала взять итератор в несинхронизованном, а читать в синхр
redwhite90 ,
Ну тем более :-) Еще раз, главная идея здесь в том, что работа с итератором строится через последовательные вызовы его методов. Как минимум hasNext() и next(). Если вы все эти вызовы не обернете в единую критическую секцию, то другой поток между, например, двумя последовательными вызовами next() из вашего потока, может вставить в коллекцию новое значение. И вы словите ConcurrentModificationException. Это в лучшем случае. А в худшем - ваш итератор может проскочить какие-то элементы. Может напороться на неверный индекс массива, бросив ArrayIndexOutOfBoundsException, и т.д.
Вам оно надо? Думаю, нет :-) Потому и надо оборачивать работу с итератором в synchronized.
...
Рейтинг: 0 / 0
26.05.2014, 21:55
    #38652568
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
synchronizedMap.безопасно ли сначала взять итератор в несинхронизованном, а читать в синхр
cdtyjv,

Код: java
1.
2.
3.
Set s = m.keySet();  // Needn't be in synchronized block
...//я вообще боялся, что тут может что-то плохое случиться
synchronized(m) {  // Synchronizing on m, not s!
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / synchronizedMap.безопасно ли сначала взять итератор в несинхронизованном, а читать в синхр / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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