A coworker and I spent a total of at least 8 man-hours this week tracing down one threading bug. The original author was locking access to shared state, and got it almost right.
Writing thread-safe code that uses global mutable state is hard. It's much easier to avoid the problem entirely.
Functional programming emphasizes pure functions (the same inputs will always give the same output, with no side effects) and immutable types. If you write your code in that style, thread safety comes naturally.
Regardless of programming language, consider a more functional approach. Your future self will thank me.
For a good book on the subject, try Real-World Functional Programming: With Examples in F# and C#.