strings can be shared, so you don't necessarily know who else might be locking on that key object for what other reason
strings might not be shared: you may be locking on one string key with the value "Key1" and some other piece of code may have a different string object that also contains the characters "Key1". To the dictionary they're the same key but as far as locking is concerned they are different objects.
That locking won't prevent changes to the value objects themselves, i.e. matrixElements[someKey].ChangeAllYourContents()