Правильно ли сказать, что можно спроектировать параллельную/параллельную систему с использованием атомарных операций ИЛИ с использованием неизменяемых типов? т.е. атомарные операции приводят к разработке системы с атомарно общим состоянием, а неизменяемые типы приводят к разработке системы, которая избегает совместного использования всех вместе? Являются ли эти два дизайна по существу заменой друг друга (решая одну и ту же основную проблему) или они решают разные проблемы (это означает, что для разработки полностью защищенной от параллелизма системы может потребоваться использовать как атомарные операции, так и неизменяемые типы)?
Являются ли атомарность и неизменность двумя разными способами решения одних и тех же проблем в параллельном/параллельном программировании?
Ответы (2)
Хотя обе концепции применимы к параллельным системам и обе гарантируют, что никакое промежуточное состояние никогда не будет прочитано, они очень разные и подходят для разных сценариев. Например, итерация неизменяемой структуры данных гарантирует правильную и «безопасную» итерацию, в то время как изменяемые структуры данных небезопасны для итерации, даже если изменяющие операции являются атомарными. С другой стороны, атомарная модификация общего/центрального хранилища данных гарантирует, что неверные данные никогда не будут прочитаны, в то время как неизменность не имеет значения, поскольку хранилище должно изменяться.
ConcurrentHashMap
является одновременно изменчивым и итерируемым, поэтому я бы сказал, что некоторые структуры данных небезопасны для этого.
- person Gray; 24.06.2017
Правильно ли сказать, что можно спроектировать параллельную/параллельную систему с использованием атомарных операций ИЛИ с использованием неизменяемых типов?
Мне это кажется чем-то вроде вынужденного аргумента. В приведенном вами примере кажется, что эти два понятия связаны, но лишь незначительно. Я бы сказал, что эти две разные концепции помогают в реализации и оптимизации параллельных/параллельных архитектур.
Являются ли эти два дизайна по существу заменой друг друга (решая одну и ту же основную проблему) или они решают разные проблемы (это означает, что для разработки полностью защищенной от параллелизма системы может потребоваться использовать как атомарные операции, так и неизменяемые типы)?
Они, конечно, не "заменители". Я бы сказал, что атомарность решает конкретную проблему с параллельными системами, но неизменность - это скорее "приятно иметь".
Если вы блокируете параллельные потоки, вам потребуются атомарные операции для выполнения (например) операций проверки и установки и разблокировки и ожидания, которые необходимы для обмена данными и передачи сигналов. Вероятно, есть и другие способы сделать это без атомарности, но это, вероятно, становится намного сложнее.
Неизменяемые типы являются отличительной чертой параллельных/параллельных архитектур, поскольку потоки могут безопасно обмениваться данными, не беспокоясь об их модификации. Неизменяемость также помогает оптимизировать видимость данных. Но при этом неизменность не является обязательным требованием.
т.е. атомарные операции приводят к разработке системы с атомарно общим состоянием, а неизменяемые типы приводят к разработке системы, которая избегает совместного использования всех вместе?
Не совсем. Атомарность заключается в том, чтобы избежать условий гонки, когда потоки обновляют одно и то же состояние, как указано выше, однако совместное использование состояния не обязательно является атомарным.
Вы, безусловно, можете обмениваться данными между двумя потоками без использования атомарных ни неизменяемых типов. Поток № 1 обновляет State1
, который используется всеми потоками, и поток № 2 обновляет State2
, который также является общим.