Ребят, у меня бывает вылетает ошибочка, о том что идет доступ к неконкурентной версии ArrayList, но в коде всё нормально.
Скорее всего где то "глубоко" идет просто вызов двух функций, которые обращаются к одному и тому же листу. Точнее вторая обращается в то время, когда первая еще не закончила с ним работу.
Вот самим ошибка к примеру
и сам код
Добавлено через 9 минут
oO
Сейчас попробую сделать пару элементов synchronized посмотрю что будет...
Скорее всего где то "глубоко" идет просто вызов двух функций, которые обращаются к одному и тому же листу. Точнее вторая обращается в то время, когда первая еще не закончила с ним работу.
Вот самим ошибка к примеру
Код:
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:782)
at java.util.ArrayList$Itr.next(ArrayList.java:754)
at l2p.gameserver.data.xml.holder.SkillAcquireHolder.getAvaliableAllList(SkillAcquireHolder.java:212)
at l2p.gameserver.data.xml.holder.SkillAcquireHolder.getAvailableAllSkills(SkillAcquireHolder.java:206)
at l2p.gameserver.network.serverpackets.ExAcquirableSkillListByClass.<init>(ExAcquirableSkillListByClass.java:19)
at l2p.gameserver.network.clientpackets.RequestSkillList.runImpl(RequestSkillList.java:25)
at l2p.gameserver.network.clientpackets.L2GameClientPacket.run(L2GameClientPacket.java:51)
at l2p.commons.net.nio.impl.MMOExecutableQueue.run(MMOExecutableQueue.java:38)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:636)
и сам код
Код:
public Collection<SkillLearn> getAvailableAllSkills(Player player)
{
final Collection<SkillLearn> skills;
skills = _normalSkillTree.get(player.getActiveClassId());
if (player.isAwaking())
{
Collection<SkillLearn> askills = _normalSkillTree.get(player.getAwakingId());
for (SkillLearn s : askills)
skills.add(s);
}
if(skills == null)
{
info("skill tree for class " + player.getActiveClassId() + " is not defined !");
return Collections.emptyList();
}
return getAvaliableAllList(skills, player.getAllSkillsArray(), player.getLevel());
}
private Collection<SkillLearn> getAvaliableAllList(final Collection<SkillLearn> skillLearns, Skill[] skills, int level)
{
Set<SkillLearn> skillLearnMap = new HashSet<SkillLearn>();
loop:for(SkillLearn temp : skillLearns)
{
for (Skill s : skills)
{
if (temp.getId() == s.getId())
{
if (temp.getLevel()-1 == s.getLevel())
{
skillLearnMap.add(temp);
}
continue loop;
}
if (s.isRelationSkill())
{
for (int ds : s.getRelationSkills())
{
if (temp.getId() == ds)
continue loop;
}
}
}
if (temp.getLevel() == 1)
skillLearnMap.add(temp);
}
return skillLearnMap;
}
Добавлено через 9 минут
oO
Сейчас попробую сделать пару элементов synchronized посмотрю что будет...