This document discusses techniques for building efficient software transactional memory (STM) systems. It begins by demonstrating how STM avoids problems like lost updates and deadlocks that can occur with traditional locking. It then reviews several existing STM implementations and their approaches. Benchmark results showing the performance of STM systems are presented, along with analysis of overhead sources. The document concludes by discussing optimizations like static analysis that can reduce STM overhead and make data structures more friendly to concurrent transactions.