Nested locks will work - however one of the dangers is that one needs to always lock the objects in the same order, else one could cause a deadlock.
EDIT:
To answer the second question around trying force the correct order of locks:
A possible solution to avoid this might be to encapsulate the locking into a common lock method like this:
public void LockAndDoWork(Action action)
{
lock(lockObject1)
{
lock(lockObject2)
{
action();
}
}
}
This could then be used like this:
Thread1: LockAndDoWork(() => {do some work....});
Thread2: LockAndDoWork(() => {do some other work...});
This can help avoid this potential issue - it's especially useful if one can limit visibility to those objects from client code