|
|
|
Java предупреждения при Synhronized
|
|||
|---|---|---|---|
|
#18+
Добрый день. У меня вопрос есть. При анализе 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. Или я не прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 09:39:04 |
|
||
|
Java предупреждения при Synhronized
|
|||
|---|---|---|---|
|
#18+
Просто warning, чтобы девелопер лишний раз перепроверил. С другой стороны это бесполезная инспекция, её можно отключить. synchronized в новых версиях Java почти игнорируется, если фактической конкуренции не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 10:08:55 |
|
||
|
Java предупреждения при Synhronized
|
|||
|---|---|---|---|
|
#18+
Спасибо большое. И еще тогда вопрос. Blazkowicz synchronized в новых версиях Java почти игнорируется, если фактической конкуренции не будет. Я так понимаю игнорируется в RunTime ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 10:25:13 |
|
||
|
Java предупреждения при Synhronized
|
|||
|---|---|---|---|
|
#18+
lokoArtЯ так понимаю игнорируется в RunTime ? Да ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 10:41:17 |
|
||
|
Java предупреждения при Synhronized
|
|||
|---|---|---|---|
|
#18+
lokoArt, какой смысл синхронизироваться по obj, если он не модифицируется? и почему нет синхронизации по объектам, которые действительно модифицируются? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 11:16:21 |
|
||
|
Java предупреждения при Synhronized
|
|||
|---|---|---|---|
|
#18+
rfqкакой смысл синхронизироваться по obj, если он не модифицируется? Синхронизация проиходит по экземпляру объекта. Финальность переменной ни на что не влияет вообще. rfqи почему нет синхронизации по объектам, которые действительно модифицируются? ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 11:23:42 |
|
||
|
Java предупреждения при Synhronized
|
|||
|---|---|---|---|
|
#18+
Вообще я бы тут ещё несколько раз подумал об этом коде вообще. Потому как он выглядит бессмысленным. Читаем 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? Расскажите какую цель вы преследуете и какую проблему решает ваш код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 11:27:44 |
|
||
|
Java предупреждения при Synhronized
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Если пофантазировать, то можно предположить, что методы firstObject и secondObject не потокобезопасные. Так же по объектам хранящимся в map может выполняться синхронизация в других частях программы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 11:46:08 |
|
||
|
Java предупреждения при Synhronized
|
|||
|---|---|---|---|
|
#18+
wessenBlazkowicz, Если пофантазировать, то можно предположить, что методы firstObject и secondObject не потокобезопасные. Так же по объектам хранящимся в map может выполняться синхронизация в других частях программы. ну и HashMap еще может быть синхронизированной, тогда все ок, но вот что-то мне подсказывает, что на самом деле все совсем не так ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 11:47:41 |
|
||
|
Java предупреждения при Synhronized
|
|||
|---|---|---|---|
|
#18+
wessenЕсли пофантазировать :) Удачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 11:47:54 |
|
||
|
Java предупреждения при Synhronized
|
|||
|---|---|---|---|
|
#18+
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 должен сам синхронизовать все.... Я правильно понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 12:18:37 |
|
||
|
Java предупреждения при Synhronized
|
|||
|---|---|---|---|
|
#18+
lokoArtЯ думал так: Я не хочу чтобы какой-нибудь поток изменил мне поля firstObject и secondObject. Mutability и Concurrency это две разные темы. lokoArtЕсли этот код будет без synchronized, то получится что я считаю.... Эм... Получается смысла. Нет?!!! Я сейчас только понял. Я же при присваивании ссылки получаю на объекты. Так и я о том же. Смысла не много. Предлагаю более четко озвучить проблему. lokoArtА put должен сам синхронизовать все.... Я правильно понял? Это вы как-то много от "put" хотите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 12:33:13 |
|
||
|
Java предупреждения при Synhronized
|
|||
|---|---|---|---|
|
#18+
lokoArtЯ думал так: Я не хочу чтобы какой-нибудь поток изменил мне поля firstObject и secondObject. О. Так я угадал. Тогда надо так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2012, 12:41:55 |
|
||
|
Java предупреждения при Synhronized
|
|||
|---|---|---|---|
|
#18+
lokoArtА put должен сам синхронизовать все.... Я правильно понял? Это вы как-то много от "put" хотите.[/quot] Ссори, я не правильно написал там не HashMap а HashTable. А HashTable уже сама потокобезопасная насколько я понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2012, 06:37:13 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37760800&tid=2131980]: |
0ms |
get settings: |
14ms |
get forum list: |
23ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
65ms |
get topic data: |
17ms |
get forum data: |
4ms |
get page messages: |
70ms |
get tp. blocked users: |
2ms |
| others: | 384ms |
| total: | 591ms |

| 0 / 0 |
