Решение 11 распространенных проблем в многопоточном коде - Чистота

ОГЛАВЛЕНИЕ

Чистота

Даже в случае неизменных типов данных большинством операций, выполняемых программой, являются вызовы методов. И вызовы методов могут иметь побочные эффекты, создающие проблемы в параллельном коде потому, что побочный эффект подразумевает какое-либо изменение. Чаще всего это будет простая запись в общую память, но это также может быть физически изменяющаяся операция, такая как транзакция базы данных, вызов веб-службы или операция файловой системы. Во многих случаях я хотел бы иметь возможность вызвать определенный метод, не опасаясь, что это приведет к угрозам, связанным с одновременностью. Хорошим примером этого являются простые методы вроде GetHashCode и ToString на System.Object. Большинство программистов не будут ожидать от них побочных эффектов.

Чистый метод всегда можно использовать в среде одновременного выполнения без добавочной синхронизации. Хотя чистота не обладает распространенной поддержкой в языках, чистый метод определить очень просто:

  1. Он считывает только из общей памяти и считывает только неизменное или постоянное состояние.
  2. Само собой, он может записывать в локальные переменные.
  3. Он может вызывать только другие чистые методы.

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