Program Analysis Techniques for Identifying Concurrency Errors