Прочесть про STM можно хотя бы в википедии: http://en.wikipedia.org/wiki/Software_transactional_memory
Мы можем (грубо) выделить 2 подхода:
1. Функциональная STM: вместо того чтобы лочить память, мы производим над ней операцию, а побочный эффект этой операции, касающийся ВВ на диск, по сети и так далее система не применяет сразу же, а сохраняет в виде замыкания, монады и тому подобного. Если после окончания операции выяснится, что память не поменялась еще какой-то другой конкурирующей операцией, то мы "воспроизводим" сохраненный побочный эффект: пишем на диск, по сети и так далее. Если же выяснится, что память поменялась еще какой-то другой конкурирующей операцией, то мы выбрасываем сохраненный побочный эффект и "перезапускаем" операцию заново.
2. Процедурная STM: лочим память, делаем все что надо, разлочиваем память. Если вдруг кому-то в это время память требуется -- он стоит и ждет.