При многопоточной работе исключена вероятность одновременнего доступа к ресурсам?
Ты не совсем понял проблему многопоточности. Да, чтение неизменяемого значения из множества потоков безопасно, но вот изменение - нет.
На примере:
Лежит в памяти значение x = 1. Пока его только читают, всё ок, но предположим, что это у нас какой-то счётчик и два потока хотят его увеличивать на 1.
Первый поток считывает значение, кладёт его в стек, добавляет 1 и после записывает результат (2) обратно. Сам видишь, что тут отнюдь не одна операция, и между моментом считывания и записью проходит время. В это время второй поток может спокойно успеть считать пока ещё старое значение. Выходит, что оба потока возьмут 1, увеличать её на 1 и запишут в память, не важно в каком порядке. В результате вроде как оба потока отработало код, но значение в памяти увеличено только на 1. В этом и проблема.
Списки, к примеру, внутри хранят тот же счётчик для количества элементов, поэтому одновременная запись может неправильно отработать.
Как я понял, когда я запускаю несколько потоков, то они не работают одновременно. На деле процессор сначала n секунд занимается одним потоком, потом n секунд - другим и т. д. Это называется переключение контекста. 
Процессоров и ядер может быть несколько. Соотвествтвенно эти рассуждения только в случае одного процессора и одного ядра. Но и в случае одного ядра атомарность операций не гарантированна см комментарий Meloman19 
https://habr.com/ru/company/intel/blog/243385/
https://www.howtogeek.com/194756/cpu-basics-multip...