На самом деле не достаточно информации, чтобы ответить на ваш вопрос, но обо всем по порядку.
Простое использование блоков lock
не делает ваш код поточно-ориентированным.
Все, что вы делаете в A
, делает невозможным для нескольких потоков одновременно вызывать любую функцию, тело которой вы заключаете в lock(mLock)
.Безопасность потоков - это широкий термин, и предотвращение одновременных вызовов - это только один аспект (и не всегда то, что вы хотите или нуждаетесь).Если это то, что вам нужно, то вы, очевидно, выбрали правильный подход.Просто будьте уверены в этом.
Во-вторых, то, что вам нужно представить вашему подклассу, не очевидно из приведенного выше кода.У вас есть три сценария:
B
может вызывать protected
(или internal
, если он находится в той же сборке, что и A
) функции A
, которые не заключены в *Блоки 1020 * B
будут вызывать только те функции на A
, которые заключены в блоки lock(mLock)
и не предоставляют каких-либо собственных операций, требующих предотвращения одновременных вызовов B
будет вызывать только те функции на A
, которые заключены в блоки lock(mLock)
, а также выполняет собственные операции, требующие предотвращения одновременных вызовов.
, что действительно сводитсяна два несвязанных вопроса:
- Будет ли
B
взаимодействовать с A
способом, который необходимо защитить (другими словами, таким образом, что еще не Защищено)? - Будет ли
B
предоставлять функциональность, которая должна быть защищена, и, если да, должны ли они использовать один и тот же объект блокировки?
Если 1) верно для 2), и они должны использовать один и тот же объект блокировки, тогдавам нужно будет выставить свой блокирующий объект с помощью свойства protected
и использовать его во всех ваших блокировках (я бы также предложил использовать его в пределах A
для удобства чтения).
Если ни один из них не равен true,тогда не беспокойся об этом.Если 2) верно, но им не нужно использовать один и тот же объект блокировки (другими словами, было бы приемлемо иметь одновременные вызовы A
и B
), тогда не беспокойтесь о раскрытии объекта блокировки,Помните, что любые вызовы, которые B
делает в функцию на A
, защищенную lock(mLock)
, будут блокировать этот объект в любом случае, независимо от каких-либо внешних блокировок.