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 методы не корректно, получим кучу соплей на выходе. |
Re: LinkedHashMap в эффекте
Спасибоу за разъяснения, в дальнейшем заюзаю конкурент хеш мэп, когда сделаю возможность эффектам: "Данный эффект может быть наложен одновременно только на одну/две/три и т.д. целей."
Быстро, оперативно и чётко запуляли ответами, класс ;D. |
Re: LinkedHashMap в эффекте
Ты пытаешься реализовать что-то подобное радару из ревелейшен ? Интересно просто :)
|
Re: LinkedHashMap в эффекте
Цитата:
Black List - позволяет метить до трёх целей подряд. А потом мы можем переместиться к любой из этих трёх целей. Мапа нужна была для второй абилы. |
Re: LinkedHashMap в эффекте
Цитата:
|
Re: LinkedHashMap в эффекте
Цитата:
|
Re: LinkedHashMap в эффекте
Цитата:
|
Re: LinkedHashMap в эффекте
Лично мое мнение по поводу любых коллекций и многопоточности.
используйте блокировки, причем использовать их нужно там где существует возможность вхождения нескольких потоков в чтение и запись. А использование Concurrent на мой взгяд - костыль. Ибо при записи создается копия коллекции... что при определенных обстоятельствах может повести за собой баги или даже дюп. Код:
Чтение Код:
using System.Threading; PS удалять элементы коллекции в цикле итерации по самой же коллекции - нельзя. Выход - те элементы которые нужно удалить в цикле помещаем в коллекцию удаления. Прим ArrayList<item> deletedList; и потом уже после цикла главной коллекции - добавляем цикл удаления если deletedList.count > 0. и в нем уже удаляем элементы из главной коллекции а после deletedList.clear(); |
Текущее время: 11:26. Часовой пояс GMT +3. |
Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot