LinkedHashMap в эффекте
При onStart() эффекта, в LinkedHashMap добавляет ключ-значение.
При onExit() эффекта, ключ-значение оттуда удаляется. Словлю ли я Exception?, если onStart() по времени, вызовется одновременно с onExit() и карта, попробует добавить и удалить ключ-значение? Что вообще здесь происходит? Может стоит использовать в таких случаях ConcurrentHashMap? |
Re: LinkedHashMap в эффекте
ConcurrentModificationException можно словить лишь в том случае, если во время перебора forEach, Iterator, удалить, добавить, либо еще сделать какую либо операцию по изменению элементов. Она приведет к ошибке.
P.S. Зачем нужна именно эта мапа ?) Для более ясного ответа, нужно знать - мапа работает на 1-го игрока, либо глобально на эффект ? |
Re: LinkedHashMap в эффекте
Цитата:
Например, если эффект можно наложить лишь на 3 цели - одним кастером. При наложении на 4-ую, из мапы убирается 1 товарищ (и эффект с него тоже снимается) и добавляется другой. |
Re: LinkedHashMap в эффекте
Цитата:
Если нечего удалять вернет null, как и в случае putIfAbsent, etc... Как подметил Mangol ConcurrentModificationException - мы можем выхватить, только если удаляем напрямую из коллекции - во время работы итератора. Нужно использовать метод итератора remove(), чтобы было корректно. |
Re: LinkedHashMap в эффекте
Цитата:
П.1 Не только удаляем, при любом добавлении либо удалении, получим ConcurrentModificationException. На сколько я помню там есть проверка. int mod=correctMod; if(mod != correctMod) привет ConcurrentModificationException; Добавлено через 10 минут Цитата:
Ну если на крайний случай map = HashMap<>(); //write code; synchronized(map) // mutex { //write code; } //write code; |
Re: LinkedHashMap в эффекте
Если мапка не используется в каких либо итераторах, то можешь смело добавлять и тереть в ней сколько влезет.
Если же задействована в итераторе (не важно по ключам, значениям или парам), тогда уже нужен пакет concurency, либо синхронизация. Вообще любое изменяемое хранилище, к которому могут получить доступ несколько потоков по дефолту должно быть конкурентным. |
Re: LinkedHashMap в эффекте
Mangol,
PHP код:
Java 8: PHP код:
PHP код:
PHP код:
|
Re: LinkedHashMap в эффекте
Цитата:
i.remove(); } Сделай 2-ое удаление :redlol: |
Re: LinkedHashMap в эффекте
Цитата:
PHP код:
|
Re: LinkedHashMap в эффекте
Цитата:
PHP код:
Но есть побочные эффекты, такие как PHP код:
PHP код:
Если в хранилище залетело какой то объект во время while (i.hasNext()) { switch((String)i.next().getKey()) { Получим ConcurrentModification и опять же курим. Как я сказал выше, во время доступа побочного потока если такой имеется, вызывать итератор, либо forEach методы не корректно, получим кучу соплей на выходе. |
Текущее время: 13:38. Часовой пояс GMT +3. |
Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot