After viewing this presentation I now have a much better understanding of how the Java Memory Model works, and how important the synchronized and volatile keywords are when sharing variables across multiple threads. Previously I have only really used the synchronized keyword as a critical section, and never really accounted for how it protects against shared data access.