Из документации MSDN:
«Synchronized поддерживает несколько потоков записи при условии, что никакие потоки не читают Hashtable. Синхронизированная оболочка не обеспечивает поточно-безопасный доступ в случае одного или нескольких читателей и одного или нескольких писателей».
Источник: http://msdn.microsoft.com/en-us/library/system.collections.hashtable.synchronized.aspx
Похоже, мне все равно придется использовать блокировки, поэтому мой вопрос: зачем нам вообще использовать Hashtable.Synchronized?





По этой же причине существуют разные уровни транзакции БД. Вы можете заботиться о том, чтобы запись была гарантирована, но не возражаете против чтения устаревших /, возможно, неверных данных.
Подумайте вместо счетчика. Несколько потоков могут увеличить значение в таблице, и вы хотите отобразить значение счетчика. Неважно, отображаете ли вы 1,200,453, а на самом деле количество 1,200,454 - вам просто нужно закрыть его. Однако вы не хотите, чтобы данные были повреждены. Это тот случай, когда потокобезопасность важна для записи, но не чтения.
когда вы говорите «вы не хотите, чтобы данные были повреждены», как бы это выглядело, если бы данные были повреждены? Я считаю неправильный счетчик поврежденным.
Если Google сообщает, что существует 1 200 453 страницы, потому что 1 200 454-я страница была только что добавлена, а запись Hashtable, содержащая счетчик, обновлялась прямо при отправке запроса, я бы не стал считать это проблемой. Вся концепция сегментированных счетчиков в GAE основана на этом принципе.
Для случая, когда вы можете гарантировать, что ни один читатель не получит доступ к структуре данных при записи в нее (или когда вам все равно, что читать неправильные данные). Например, когда структура не изменяется постоянно, а выполняется одноразовое вычисление, к которому вам позже понадобится доступ, хотя и достаточно огромного, чтобы гарантировать, что в нее записываются многие потоки.
итак, окончательный результат всех многопоточных записей в эту синхронизированную структуру данных будет таким же, если бы у меня была блокировка структуры данных?
вам понадобится это, когда вы для каждого по хеш-таблице в одном потоке (читает), и существуют другие потоки, которые могут добавлять / удалять элементы в / из него (записывает) ...
В .NET 3.5 и выше (я понимаю, что это старый вопрос) это безопасно для множества читателей и писателей.