Data races are dangerous because they are easy to introduce and difficult to find. Even highly experienced programmers may accidentally introduce races and other concurrency errors in code and not discover them until systems are deployed or shipped. On top of this, it has become more important to make use of concurrent programming to take advantage of multiple cores and multiple processors. This paper details several ways concurrency errors can be introduced and how to resolve them. Finally, this paper describes how GrammaTech built concurrency checking into the CodeSonar static analysis tool through innovative research for DARPA.