ФП программа не хранит состояние/state, кототое бы могли конкурентно изменять потоки. А в чистом ФП и именования должны быть неизменными/immutable. То есть в чистом ФП конструкция
something = 2
something = 3
нелегальна, противоестественна. Если
something = 2
, то это навсегда и не может вдруг стать
=3
. При таком подходе потоки не могут получить одновременный доступ к одному месту в памяти пытаясь изменить переменную состояния. Для обмена данными между потоками можно только использовать специальные примитивы защищеннные под капотом механизмами синхронизации операционной системы(вроде Mutex или Atomic). Например очередь сообщений может быть представлена списком/list которым нельзя манипулировать напрямую, а только методами
Queue.Put() Queue.Get()
. И в реализации этих методов уже зашиты блокировки от параллельного доступа к памяти.