Threads are an integral part of the Java language and have evolved largely introducing new ways to synchronize/lock your data but the basics of Atomicity & Visibility remains same, which are essential to understand and write robust multi-threaded applications. I recently authored a post explaining the basics of Synchronization and introducing the various new ways to lock your data. Let me know in the comments if there is anything in that post that does not make sense.