I read somewhere, although I can't remember where, that using the lock keyword in C# can allocate.
I know that trying to lock a ValueType will box the valuetype, but are there any other situations?
EDIT::
While the allocation of see sync block internally is lazy (but that's an implementation detail which IIRC I know from Essential.NET 'volume 1', or is it CLR via C# - and should be treated as just that), the simple case of the item needing to be boxed like you're suggesting doesn't arise - see Why lock(<integer var>) is not allowed, but Monitor.Enter(<integer var>) allowed?