Ты не совсем понял проблему многопоточности. Да, чтение неизменяемого значения из множества потоков безопасно, но вот изменение - нет.
На примере:
Лежит в памяти значение x = 1
. Пока его только читают, всё ок, но предположим, что это у нас какой-то счётчик и два потока хотят его увеличивать на 1.
Первый поток считывает значение, кладёт его в стек, добавляет 1 и после записывает результат (2) обратно. Сам видишь, что тут отнюдь не одна операция, и между моментом считывания и записью проходит время. В это время второй поток может спокойно успеть считать пока ещё старое значение. Выходит, что оба потока возьмут 1, увеличать её на 1 и запишут в память, не важно в каком порядке. В результате вроде как оба потока отработало код, но значение в памяти увеличено только на 1. В этом и проблема.
Списки, к примеру, внутри хранят тот же счётчик для количества элементов, поэтому одновременная запись может неправильно отработать.