Other Approaches
The simplest approach to writing concurrent code is to make someone else do the hard part. You'll find existing libraries for lock-free data structures in a lot of languages. Sometimes they're part of the platform APIs.
I've skimmed over the details in most of the techniques described in this article. In particular, I've avoided talking about memory barriers, which are very important if you have a non-x86 CPU.
In part 3, which concludes this series, we'll look at some of the other approaches to concurrency, including some languages designed for parallel programming, and some more interesting techniques such as transactional memory.