Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Java предупреждения при Synhronized / 14 сообщений из 14, страница 1 из 1
19.04.2012, 09:39:04
    #37760435
lokoArt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java предупреждения при Synhronized
Добрый день. У меня вопрос есть. При анализе Idea выкидывает мне предупреждения. Но я не могу понять почему.

У меня есть HashMap, я его передаю в метод другого класса. И там примерно следующий код:
final object obj = map.get(id);
if(obj != null) {
synchronized (obj) {
newobj.firstObject = obj.firstObject;
newobj.secondObject = obj.secondObject;
map.put(id, newobj)
}
}

Я получаю следующее предупреждение:"synchronized on a local variable java". Почему?
У меня примерно вот такое понимание что происходит:
1) При map.get(id) я получаю ссылку. И если я в ней что-нибудь поменяю, то поменяется значение в map. Или я не прав?
...
Рейтинг: 0 / 0
19.04.2012, 10:08:55
    #37760498
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java предупреждения при Synhronized
Просто warning, чтобы девелопер лишний раз перепроверил. С другой стороны это бесполезная инспекция, её можно отключить. synchronized в новых версиях Java почти игнорируется, если фактической конкуренции не будет.
...
Рейтинг: 0 / 0
19.04.2012, 10:25:13
    #37760524
lokoArt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java предупреждения при Synhronized
Спасибо большое. И еще тогда вопрос.
Blazkowicz synchronized в новых версиях Java почти игнорируется, если фактической конкуренции не будет.
Я так понимаю игнорируется в RunTime ?
...
Рейтинг: 0 / 0
19.04.2012, 10:41:17
    #37760547
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java предупреждения при Synhronized
lokoArtЯ так понимаю игнорируется в RunTime ?
Да
...
Рейтинг: 0 / 0
19.04.2012, 11:16:21
    #37760627
rfq
rfq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java предупреждения при Synhronized
lokoArt,

какой смысл синхронизироваться по obj, если он не модифицируется? и почему нет синхронизации по объектам, которые действительно модифицируются?
...
Рейтинг: 0 / 0
19.04.2012, 11:23:42
    #37760640
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java предупреждения при Synhronized
rfqкакой смысл синхронизироваться по obj, если он не модифицируется?

Синхронизация проиходит по экземпляру объекта. Финальность переменной ни на что не влияет вообще.

rfqи почему нет синхронизации по объектам, которые действительно модифицируются?
?
...
Рейтинг: 0 / 0
19.04.2012, 11:27:44
    #37760648
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java предупреждения при Synhronized
Вообще я бы тут ещё несколько раз подумал об этом коде вообще. Потому как он выглядит бессмысленным.
Читаем JavaDoc HashMap:

If multiple threads access a hash map concurrently, and at least one of
the threads modifies the map structurally, it <i>must</i> be
synchronized externally. (A structural modification is any operation

Какой смысл тогда синхронизировать по id, если 2 потока по разным id вызовут параллельный put, что приведет к ошибке.

А если put операцию в любом случае нужно синхронизировать между всем потоками. То зачем тогда синхронизировать по id?
Расскажите какую цель вы преследуете и какую проблему решает ваш код.
...
Рейтинг: 0 / 0
19.04.2012, 11:46:08
    #37760675
wessen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java предупреждения при Synhronized
Blazkowicz,

Если пофантазировать, то можно предположить, что методы firstObject и secondObject не потокобезопасные. Так же по объектам хранящимся в map может выполняться синхронизация в других частях программы.
...
Рейтинг: 0 / 0
19.04.2012, 11:47:41
    #37760681
wessen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java предупреждения при Synhronized
wessenBlazkowicz,

Если пофантазировать, то можно предположить, что методы firstObject и secondObject не потокобезопасные. Так же по объектам хранящимся в map может выполняться синхронизация в других частях программы.

ну и HashMap еще может быть синхронизированной, тогда все ок, но вот что-то мне подсказывает, что на самом деле все совсем не так )
...
Рейтинг: 0 / 0
19.04.2012, 11:47:54
    #37760682
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java предупреждения при Synhronized
wessenЕсли пофантазировать

:) Удачи.
...
Рейтинг: 0 / 0
19.04.2012, 12:18:37
    #37760754
lokoArt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java предупреждения при Synhronized
BlazkowiczВообще я бы тут ещё несколько раз подумал об этом коде вообще. Потому как он выглядит бессмысленным.
Читаем JavaDoc HashMap:

If multiple threads access a hash map concurrently, and at least one of
the threads modifies the map structurally, it <i>must</i> be
synchronized externally. (A structural modification is any operation

Какой смысл тогда синхронизировать по id, если 2 потока по разным id вызовут параллельный put, что приведет к ошибке.

А если put операцию в любом случае нужно синхронизировать между всем потоками. То зачем тогда синхронизировать по id?
Расскажите какую цель вы преследуете и какую проблему решает ваш код.

Я думал так: Я не хочу чтобы какой-нибудь поток изменил мне поля firstObject и secondObject.
Если этот код будет без synchronized, то получится что я считаю....
Эм... Получается смысла. Нет?!!! Я сейчас только понял. Я же при присваивании ссылки получаю на объекты.
А put должен сам синхронизовать все.... Я правильно понял?
...
Рейтинг: 0 / 0
19.04.2012, 12:33:13
    #37760775
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java предупреждения при Synhronized
lokoArtЯ думал так: Я не хочу чтобы какой-нибудь поток изменил мне поля firstObject и secondObject.

Mutability и Concurrency это две разные темы.

lokoArtЕсли этот код будет без synchronized, то получится что я считаю....
Эм... Получается смысла. Нет?!!! Я сейчас только понял. Я же при присваивании ссылки получаю на объекты.

Так и я о том же. Смысла не много. Предлагаю более четко озвучить проблему.

lokoArtА put должен сам синхронизовать все.... Я правильно понял?
Это вы как-то много от "put" хотите.
...
Рейтинг: 0 / 0
19.04.2012, 12:41:55
    #37760800
wessen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java предупреждения при Synhronized
lokoArtЯ думал так: Я не хочу чтобы какой-нибудь поток изменил мне поля firstObject и secondObject.


О. Так я угадал.
Тогда надо так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Map map = Collections.synchronizedMap(new HashMap());

// и далее все как было 
if(obj != null) {
  synchronized (obj) {
    newobj.firstObject = obj.firstObject;
    newobj.secondObject = obj.secondObject;
    map.put(id, newobj)
  }
}
...
Рейтинг: 0 / 0
20.04.2012, 06:37:13
    #37762230
lokoArt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java предупреждения при Synhronized
lokoArtА put должен сам синхронизовать все.... Я правильно понял?
Это вы как-то много от "put" хотите.[/quot]

Ссори, я не правильно написал там не HashMap а HashTable. А HashTable уже сама потокобезопасная насколько я понимаю.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Java предупреждения при Synhronized / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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