2016-08-14 5 views
0

Обычно говорят, что неизменяемые структуры данных более «дружественны» для программирования параллелизма. Объяснение состоит в том, что если структура данных изменена и один поток изменяет ее, тогда другой поток будет «видеть» предыдущий режим структуры данных.Является ли неизменяемость более полезной для параллелизма?

Хотя невозможно изменить неизменяемую структуру данных, если нужно ее изменить, можно создать новую структуру данных и дать ей ссылку на «старую» структуру данных.

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

+0

«Если структура данных изменена и один поток изменяет ее, то другой поток« увидит »предыдущий режим структуры данных». Это часто бывает не так просто. На всех языках, которые я знаю, поведение несинхронизированной записи и чтения не определено. Например, если структура состоит из нескольких байтов, некоторые байты могут быть перезаписаны новыми данными, в то время как другие все еще содержат старые данные, что может привести к недопустимому состоянию для определенных структур – KABoissonneault

+0

, поэтому вы действительно согласитесь со мной в том, что неизменность Решить проблему параллелизма. – CrazySynthax

+0

Неизменность обычно означает «невозможность записи». Параллельные несинхронизированные чтения обычно определяются поведением, в то время как любые одновременные несинхронизированные чтения-записи или записи-записи не определены. То, что вы описываете в своем вопросе, не является нарушением этого принципа. – KABoissonneault

ответ

2

Идея состоит в том, что вы не можете изменить объект после его создания. Каждый объект, являющийся частью некоторой структуры, сам по себе является неизменным. Когда вы создаете новую структуру и повторно используете некоторые компоненты старой структуры, вы все равно не можете изменить любое внутреннее значение любого компонента, составляющего эту новую структуру. Вы можете легко идентифицировать каждую структуру по ее корневой ссылке.

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

Есть много преимуществ неизменности над изменчивостью, но это не означает, что неизменяемость всегда лучше. Каждый подход имеет свои преимущества и приложения. Взгляните на this answer для получения более подробной информации об использовании неизменяемости. Также в некоторых случаях проверьте this красиво написанный ответ о преимуществах поспособности.

+0

Если при создании новой структуры данных и назначении ее старой ссылке, мне все равно придется делать это с помощью «потокобезопасной моды», в чем преимущество изменчивого данные по неизменяемым структурам данных? – CrazySynthax

+0

Это язык на разных языках, но обычно у вас есть какой-то завод или строитель, который будет строить новый объект из предоставленных компонентов. Например, Car.getBuilder(). AddEngine (engine) .addChasis (chassis) .build(). Вы получите новый объект Car только после вызова метода build(), поэтому его создание является потокобезопасным и простым. –