К сожалению, даже с этими рекомендациями, чтобы помочь, проектирование очень параллельных систем существенно более трудно, чем написание последовательных систем.

Использование блокировки может часто противоречить нормальной ориентированной на объект абстракции программы, потому что блокирование является действительно другим независимым измерением программы, у которой есть ее собственные критерии расчета (другие такие размеры включают управление жизненного цикла, транзакционное поведение, ограничения в реальном времени и поведение обработки исключений). Иногда потребности блокирования и потребности абстракции данных согласовывают, такой как тогда, когда они оба используются, чтобы управлять доступом к данным о случае. Есть другие времена, однако, когда они находятся в конфликте. (Мониторы полезно не гнездятся, и указатели могут заставить мониторы "протекать".)
Нет никакого хорошего разрешения этого конфликта. Итог - то, что мультипереплетенные программы более сложны. Уловка должна управлять сложностью. Уже видели одну стратегию: попытайтесь использовать всего несколько блокировок на высшем уровне иерархии абстракции данных. Даже эта стратегия может противоречить модульности, потому что много структур данных будут, вероятно, защищены одной блокировкой. Это означает, что нет никакой очевидной структуры данных, на которой можно повесить блокировку. Как правило, блокировка должна быть глобальной переменной (никогда действительно прекрасная идея для данных о чтении-записи), или часть самой глобальной включенной структуры данных. В последнем случае должно быть возможно достигнуть ту структуру от любой другой структуры, которая требует блокировки. Иногда это - вредность, потому что дополнительные параметры, возможно, должны были бы быть добавлены к некоторым методам, и дизайн мог бы стать немного грязным, но это лучше, чем альтернативы.
Когда сложность как это начинает показывать себя в дизайне, правильный ответ должен сделать ее явной, чтобы не проигнорировать ее. Если некоторый метод не берет, блокирует себя, но ожидает, что его посетитель предоставит, что взаимное исключение, то то требование является предварительным условием запроса того метода и должно быть в его интерфейсном договоре. Если с другой стороны абстракция данных могла бы взять блокировку или назвать клиента (виртуальными) методами, держа блокировку, которая также должна быть частью интерфейсного договора. Только, делая эти подробные данные явными в интерфейсных границах может принимать хорошие решения в местном масштабе относительно кода. В хорошем дизайне большинство этих договоров тривиально. Вызываемый ожидает, что посетитель предоставит исключение для всей включенной структуры данных, так указание, что это не вредность.
В идеальном мире сложность дизайна параллелизма была бы скрыта в библиотеке классов. К сожалению, есть также мало, что проектировщики библиотеки классов могут сделать, чтобы сделать библиотеку более дружественной по отношению к мультипронизыванию. Поскольку пример Hashtable показывает, блокирование всего одной структуры данных редко полезно. Это только, когда структура пронизывания программы разработана, что блокировки могут быть полезно добавлены. Обычно это делает его ответственностью разработчика приложений. Только целостные структуры как ASP.NET, которые определяют код конечного пользователя структуры пронизывания, включают