これは Go3 Advent Calendar 2017 の22日目の記事です.出張中の暇つぶしとして書いた software transactional memory パッケージ decillion/go-stm について解説します. 背景 Mutex(と RWMutex)は Go の基本的な同期プリミティブの1つですが,これを正しく使うのは容易ではありません.ちょっとした不注意が様々な問題(e.g. データ競合,デッドロック)を引き起こし,そのデバッグも簡単ではありません.粗粒度ロックを採用すれば,これらの問題が起こる可能性を下げることができますが,一方でパフォーマンスが低下する懸念があります. Software transactional memory (STM) は,上記で述べた問題とジレンマに対する解決策の1つです.STM とは,読んで字のごとく,『(DB がサポートするような)