Writing multi-threaded code is remarkably cross-cutting. It's harder to factor out common functionality when you depend on specific locks.