Объяснение различного поведения в Vector.set () и ArrayList.set () - PullRequest
0 голосов
/ 03 августа 2011

За исключением фона проекта, я реализовал таблицу пользовательских JComboBox.Каждый ряд ComboBox является эксклюзивным: хотя каждый ComboBox имеет свою собственную модель (чтобы разрешить различные варианты выбора), каждый вариант может быть выбран только один раз для каждой строки.Это делается путем добавления тега к передней части элемента при его выборе и повторного удаления при отмене выбора.Если пользователь пытается выбрать помеченный элемент, ничего не происходит.

Однако это работает только при использовании вектора в качестве основы для списка параметров.Я могу получить вектор строк, использовать либо set (), либо setElementAt (), и boom presto все работает.

С ArrayList вместо Vector, однако это не работает вообще.У меня сложилось впечатление, что ArrayLists функционируют аналогичным образом, так как я могу получить анонимный ArrayList, изменить его содержимое, а все другие объекты, зависящие от содержимого этого ArrayList, будут обновлены соответствующим образом, как и реализация Vector.Я надеялся, что кто-нибудь скажет мне, почему это не так, поскольку и Vector, и ArrayList реализуют List и предположительно должны иметь схожее поведение.

EDIT:

Спасибо за быстрый ответ!Все ответы относятся к различиям синхронизации между ArrayList и Vector.Тем не менее, мой проект явно не создает новые темы.Возможно ли, что это проблема синхронизации между моими данными и потоком Swing?Я не достаточно хорош с темами, чтобы знать ...

2-е РЕДАКТИРОВАНИЕ:

Еще раз спасибо всем!Синхронизация между данными и Swing достаточно легко отвечает на мой вопрос, хотя я все еще буду интересоваться более подробной информацией, если есть что-то еще.

Ответы [ 4 ]

1 голос
/ 03 августа 2011

Вектор синхронизирован.Он использует ключевое слово synchronized для обеспечения того, чтобы все потоки, которые обращаются к нему, видели согласованный результат.ArrayList не синхронизирован.Когда один поток устанавливает элемент ArrayList, нет гарантии, что другой поток увидит обновление.

1 голос
/ 03 августа 2011

Я подозреваю, что разница связана с тем, что Vector является поточно-ориентированным, а ArrayList - нет. Это влияет на видимость изменений его элементов в разных потоках. Когда вы изменяете элемент в Vector, изменение мгновенно становится видимым для других потоков. (Это потому, что его методы синхронизируются с помощью блокировок, которые создают барьер памяти , эффективно синхронизируя текущее состояние памяти потока - включая последние изменения в ней - с другими потоками.) Однако с ArrayList такая синхронизация не происходит автоматически, поэтому изменения, внесенные одним потоком, могут стать видимыми для других потоков только позже (и в произвольном порядке) или не появиться вовсе.

Поскольку Swing по своей природе является многопоточным, вам необходимо убедиться, что изменения данных видны между разными потоками (рабочий, пользовательский интерфейс).

0 голосов
/ 03 августа 2011

У меня нет времени на тестирование этого кода, и ваш пример кода все еще очень легкий (хороший полнофункциональный пример был бы более полезным - я не хочу писать полное приложение для тестирования этого), но я ' Я готов поспорить, что если вы обернули ваш вызов в 'setSelectDeselect' (как показано в вашей папке), то ArrayList будет работать так же, как и Vector:

Runnable selectRunnable = new Runnable() 
{
  public void run()
  {
    setSelectDeselect(cat, itemName, selected);
  }
};

SwingUtilities.invokeLater(selectRunnable);

Вы обновляете свой ArrayList в середине обработки событий. Приведенный выше код будет откладывать обновление до завершения события. Я подозреваю, что здесь есть что-то еще, что станет очевидным при просмотре остальной части вашего кода.

0 голосов
/ 03 августа 2011

Доступ к элементам Vector синхронизирован, тогда как его нет для ArrayList. Если у вас есть разные потоки, обращающиеся к спискам и изменяющие их, вы увидите различное поведение между ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...