If you didn't mark it as volatile it will work on single CPU computers (because of 32 bit atomicity), but not PC's with multiple CPU's as it would hold the value in its on die cache and not retrieve the the very latest value, Hence you need to mark with Volatile. Its true you don't need to lock items if its 32 bits in size as its just a registry sized change and thus atomic.
There is an article on it here: www.yoda.arachsys.com/csharp/threads/volatility.shtml
There is also something called Synchronization Domains.
The synchronization domain provides automatic synchronization of thread access to objects declaratively. This class was introduced as a part of the infrastructure supporting .NET remoting. Developers wishing to indicate that a class is to have access to its objects synchronized must have the class inherit from ContextBoundObject and mark it with the SynchronizationAttribute like so:
[Synchronization]
public class MyController : ContextBoundObject
{
/// All access to objects of this type will be intercepted
/// and a check will be performed that no other threads
/// are currently in this object's synchronization domain.
}
Further information on Syncronisation domains can be found here: msdn.microsoft.com/en-us/magazine/dd569749.aspx