According to MSDN:
The volatile keyword indicates that a field might be modified by multiple threads that are executing at the same time. Fields tha
Another point raised by Joseph Albahari is that process architecture can adversely impact volatile, i.e. AMD in particular can cause values to be swapped.
Since you will probably have no idea what system type your application will run on in production its best to always avoid the volatile keyword.
Also slightly off topic you should always avoid the ReaderWriterLock class as under heavy load on multiprocessor systems this can allow multiple write locks please see here to be taken simultaneously which will cause application hangs which will be extremely difficult to root cause