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