Анализ доступа к ArrayList - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Сообщество Календарь
Вернуться   Форум администраторов игровых серверов > Полезное / Common > Программирование / Programming > Java

Java В данном форуме вы сможете найти много полезной информации по платформе Java. Подробные статьи, исходные коды и конечно учебники как для новичков так и профессиональных Java разработчиков вы найдёте здесь. Если у вас есть вопрос или хотите поделится своими наработками, пожалуйста, делайте это в этой теме.

Ответ
Опции темы
Непрочитано 03.04.2012, 13:09   #1
Аватар для ALF.
Герой

Автор темы (Топик Стартер) Анализ доступа к ArrayList

Ребят, у меня бывает вылетает ошибочка, о том что идет доступ к неконкурентной версии ArrayList, но в коде всё нормально.
Скорее всего где то "глубоко" идет просто вызов двух функций, которые обращаются к одному и тому же листу. Точнее вторая обращается в то время, когда первая еще не закончила с ним работу.
Вот самим ошибка к примеру
Код:
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 посмотрю что будет...

Последний раз редактировалось ALF.; 03.04.2012 в 13:18. Причина: Добавлено сообщение
ALF. вне форума Отправить сообщение для ALF. с помощью ICQ Отправить сообщение для ALF. с помощью Skype™ Ответить с цитированием
Непрочитано 03.04.2012, 13:40   #2
Аватар для Azagthtot
Эксперт

По умолчанию Re: Анализ доступа к ArrayList

Используйте синхронизацию, для работы с этим объектом. Или блокировки
Azagthtot вне форума Отправить сообщение для Azagthtot с помощью ICQ Отправить сообщение для Azagthtot с помощью Skype™ Ответить с цитированием
Непрочитано 03.04.2012, 14:06   #3
Аватар для bloodshed
Герой

По умолчанию Re: Анализ доступа к ArrayList

во время итерации коллекции вы в другом потоке её изменяете.
не плохо было бы выделять как то строки в которых ошибка.

at l2p.gameserver.data.xml.holder.SkillAcquireHolder. getAvaliableAllList(SkillAcquireHolder.java:212) Как эту строку искать то?

И почему так сложно загуглить? Проблема по моему очень распространённая у новичков, когда только начинал сам с ней сталкивался.
__________________
bloodshed вне форума Отправить сообщение для bloodshed с помощью ICQ Отправить сообщение для bloodshed с помощью Skype™ Ответить с цитированием
Непрочитано 03.04.2012, 14:08   #4
Аватар для ALF.
Герой

Автор темы (Топик Стартер) Re: Анализ доступа к ArrayList

212 строка
Код:
		loop:for(SkillLearn temp : skillLearns)
ALF. вне форума Отправить сообщение для ALF. с помощью ICQ Отправить сообщение для ALF. с помощью Skype™ Ответить с цитированием
Непрочитано 03.04.2012, 17:34   #5
Аватар для Drizzy

По умолчанию Re: Анализ доступа к ArrayList

Юзайте фастлист)) ему всё равно на этот момент, когда его изменяют во время использования
Либо как Вам выше сказал Azagthtot.
__________________
open-team.ru
Drizzy вне форума Отправить сообщение для Drizzy с помощью ICQ Ответить с цитированием
Непрочитано 03.04.2012, 17:52   #6
Аватар для ALF.
Герой

Автор темы (Топик Стартер) Re: Анализ доступа к ArrayList

Сделал синхронизированными методы

getAvailableAllSkills
getAvaliableAllList

ничего не изменилось...
ALF. вне форума Отправить сообщение для ALF. с помощью ICQ Отправить сообщение для ALF. с помощью Skype™ Ответить с цитированием
Непрочитано 03.04.2012, 17:53   #7
Аватар для Drizzy

По умолчанию Re: Анализ доступа к ArrayList

Ну тогда блокируйте их, через ReentrantLock
__________________
open-team.ru
Drizzy вне форума Отправить сообщение для Drizzy с помощью ICQ Ответить с цитированием
Непрочитано 03.04.2012, 18:02   #8
Аватар для ANZO
Разработчик BDO Emu

По умолчанию Re: Анализ доступа к ArrayList

не методы синхронизировать надо а саму коллекцию >_<

synchronized(list)
{
бла бла бла
}
ANZO вне форума Отправить сообщение для ANZO с помощью ICQ Отправить сообщение для ANZO с помощью Skype™ Ответить с цитированием
Непрочитано 03.04.2012, 19:32   #9
Пользователь

По умолчанию Re: Анализ доступа к ArrayList

тут видимо ошибка в алгоритме (это при условии что _normalSkillTree должна хранить/хранит статические данные)

PHP код:
public Collection<SkillLearngetAvailableAllSkills(Player player)
    {
        final 
Collection<SkillLearnskills;
        
// тут ошибка видимо
        // skills = _normalSkillTree.get(player.getActiveClassId());
        
skills = new ArrayList<>(_normalSkillTree.get(player.getActiveClassId()));
        if (
player.isAwaking()) 
__________________
l2jfree | M.O.R.F. | A.P.S. | Aion | GW2 | BnS

Последний раз редактировалось hex1r0; 03.04.2012 в 19:57.
hex1r0 вне форума Ответить с цитированием
Непрочитано 05.04.2012, 10:46   #10
Аватар для ALF.
Герой

Автор темы (Топик Стартер) Re: Анализ доступа к ArrayList

Цитата:
Сообщение от ANZO Посмотреть сообщение
не методы синхронизировать надо а саму коллекцию >_<

synchronized(list)
{
бла бла бла
}
думаю смысла нету)
Цитата:
Если при написании какого-нибудь метода оказалось, что в блок synchronized входят все операторы этого метода, то можно просто пометить метод-словом synchronized, сделав его синхронизированным (synchronized):
Добавлено через 13 минут
Цитата:
Сообщение от hex1r0 Посмотреть сообщение
тут видимо ошибка в алгоритме (это при условии что _normalSkillTree должна хранить/хранит статические данные)

PHP код:
public Collection<SkillLearngetAvailableAllSkills(Player player)
    {
        final 
Collection<SkillLearnskills;
        
// тут ошибка видимо
        // skills = _normalSkillTree.get(player.getActiveClassId());
        
skills = new ArrayList<>(_normalSkillTree.get(player.getActiveClassId()));
        if (
player.isAwaking()) 
Это скорее всего только предотвратит NPE (Null Pointer Exeption), но не конкурентику.. )

А делать коллекцию конкурентной - не особо хочется.. Да и тут она не должна быть конкурентной.. ((

Последний раз редактировалось ALF.; 05.04.2012 в 11:00. Причина: Добавлено сообщение
ALF. вне форума Отправить сообщение для ALF. с помощью ICQ Отправить сообщение для ALF. с помощью Skype™ Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нет доступа Stiks World of WarCraft 7 02.07.2011 18:35
Нет доступа, но нетут то било.. woric Документация 1 13.01.2010 14:35
[схема] нужна помощь. организация доступа Ultrix Сервер 1 20.03.2009 07:38
ArrayList vs CopyOnWriteArrayList Aquanox Java 3 08.07.2008 17:33


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 13:31. Часовой пояс GMT +3.

Вверх