I was browsing through the Linux kernel documentation and came across this excellent documentation on Memory Barriers. I was able to relate many of the concepts explained in this document with the issues that used to exist in the older buggy JVMs. I would strongly recommend to anyone to go through this kernel document to easily understand the 1.5+ Java Memory Model, especially the concept of happens-before ordering. The same author has written another excellent paper "Memory Barriers: a Hardware View for Software Hackers", which covers the same topic in a bit more depth.
Paul McKenney and David Howells - thanks a lot for your excellent document that helped me understand the key concepts behind memory barriers.