Хороший вопрос.Есть плюсы и минусы в том, чтобы сделать блокировки более детализированными или более грубыми, причем одна крайность - это отдельная блокировка для каждого элемента данных, а другая - одна блокировка для всей программы.Как отмечают другие посты, недостатком повторного использования одних и тех же блокировок является то, что в общем случае вы можете получить меньше параллелизма (хотя это зависит от случая, вы не можете получить меньше параллелизма).
Однако недостаток использования большего количествазамки - это вообще вы делаете тупик более вероятным.Есть больше способов получить взаимоблокировки, чем больше замков вы задействовали.Например, одновременное получение двух блокировок в отдельных потоках, но в обратном порядке - это потенциальная тупиковая ситуация, которая не возникла бы, если бы была задействована только одна блокировка.Конечно, иногда вы можете устранить тупик, разбив одну блокировку на две, но обычно меньшее количество блокировок означает меньшее количество блокировок.Также добавлена сложность кода с наличием большего количества блокировок.
В общем, эти два фактора должны быть сбалансированы.Обычно для удобства используется одна блокировка на класс, если она не вызывает проблем с параллелизмом.На самом деле, для этого используется шаблон проектирования, называемый монитором.
Я бы сказал, что рекомендуется использовать меньшее количество блокировок для простоты кода и создавать дополнительные блокировки, если есть веская причина (например, параллелизм илислучай, когда это проще или исправляет тупик).