Почему Список <T> не ориентирован на многопотоковое исполнение?

Возможно, столбец с указанием (ноль) может содержать текст? В противном случае кажется правильным.

42
задан Dawid Ferenczy Rogožan 20 November 2016 в 03:23
поделиться

6 ответов

Действительно необходимо классифицировать тип Вектора Java потокобезопасности. Вектор Javas безопасен использоваться от нескольких потоков, потому что он использует синхронизацию на методах. Состояние не будет повреждено.

Однако полноценность вектора Java ограничена от нескольких потоков без дополнительной синхронизации. Например, рассмотрите простое действие чтения элемента от вектора

Vector vector = getVector();
if ( vector.size() > 0 ) { 
  object first = vector.get(0);
}

Этот метод не повредит состояние вектора, но это также не корректно. Нет ничего мешающего другому потоку видоизменить вектор, промежуточный, если оператор получение () звонит. Этот код может и в конечном счете перестать работать из-за состояния состязания.

Этот тип синхронизации только полезен в небольшом количестве сценариев, и это, конечно, не дешево. Вы платите noticable цену за синхронизацию, даже если Вы не используете несколько потоков.

.NET принял решение не заплатить эту цену по умолчанию за сценарий только ограниченной полноценности. Вместо этого это приняло решение реализовать блокировку бесплатный Список. Авторы ответственны за добавление любой синхронизации. Это ближе к модели C++ "платы только за то, что Вы используете"

Я недавно написал несколько статей об опасностях использовать наборы только с внутренней синхронизацией, такие как вектор Java.

Ссылочная Векторная потокобезопасность: http://www.ibm.com/developerworks/java/library/j-jtp09263.html

67
ответ дан user 26 November 2019 в 23:32
поделиться

Почему это было бы ориентировано на многопотоковое исполнение? Не каждый класс. На самом деле, по умолчанию, классы не ориентированы на многопотоковое исполнение.

Быть ориентированным на многопотоковое исполнение означало бы, что любая операция, изменяющая список, должна будет взаимно блокироваться против одновременного доступа. Это было бы необходимо даже для тех списков, которые будут только когда-либо использоваться единственным потоком. Это было бы очень неэффективно.

20
ответ дан John Saunders 26 November 2019 в 23:32
поделиться

Это - просто проектное решение реализовать типы, не ориентированные на многопотоковое исполнение. Наборы обеспечивают свойство SyncRoot из интерфейса ICollection и Synchronized() метод на некоторых наборах для того, чтобы явно синхронизировать типы данных.

Использовать SyncRoot заблокировать объект в многопоточных средах.

lock (collection.SyncRoot)
{
   DoSomething(collection);
}

Использовать collection.Synchronized() получить ориентированную на многопотоковое исполнение обертку для набора.

9
ответ дан Dawid Ferenczy Rogožan 26 November 2019 в 23:32
поделиться

Для истинной потокобезопасности, List<> и другие типы набора должны были бы быть неизменными. С параллельными расширениями.NET, выходящей в.NET 4.0, мы будем видеть ориентированные на многопотоковое исполнение версии обычно используемых наборов. Jon Skeet затрагивает часть этого.

2
ответ дан John Saunders 26 November 2019 в 23:32
поделиться

Возможность состояния состязания, которую упоминает JaredPar, является страшным последствием доверия воображаемой потокобезопасности Вектора. Это - вид вещи, которая заканчивается в "каждый девятый вторник, приложение делает что-то странное" - вид дефектного отчета, который будет управлять Вами безумный.

Существует много действительно ориентированных на многопотоковое исполнение наборов, прибывающих в.Net 4 с интересным побочным эффектом, который они позволяют однопоточную модификацию набора при перечислении, но существует хит производительности, который идет с потокобезопасностью, иногда довольно большая.

Таким образом, логической вещью для разработчика инфраструктуры сделать является содержание класс, максимально производительный для 95% пользователей, которые, вероятно, не будут делать поточной обработки и полагаться на тех, кто действительно мультираспараллеливает для знания то, что они должны сделать для защиты его.

2
ответ дан Ragoczy 26 November 2019 в 23:32
поделиться

Оказалось, что HureCardsPanel не может добавить в родительскую рамку должным образом, как только это было исправлено, добавление нового JLabels работает нормально. Я добавил вызов метода update () к потоку отправки событий с помощью SwingUtillities.invokeLater Мне пришлось дополнительно вызвать validate () из самого верхнего компонента (в данном случае JFrame )

-121--3432304-

Возникла проблема с получением ошибки после установки компонентов подключения к данным Office 2007 . Проблема в том, что он 32-разрядный вызывается 64-разрядным процессом. Различные решения здесь

-121--3076056-

используют SynchronesCollection, он также предоставляет Constructor-Parameter для использования общей синхронизации:)

0
ответ дан 26 November 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: