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