Запретить программистам блокировку экземпляра класса - PullRequest
1 голос
/ 24 сентября 2010

Можно ли написать класс таким образом, чтобы другие программисты не могли получить блокировку для экземпляра класса?

Злоупотребление блокировкой, если есть такой термин, может быть серьезным убийцей.к сожалению, программисты, разрывающиеся между пагубными силами доставки поточно-ориентированного кода и ограниченными знаниями о параллелизме, могут нанести ущерб, применяя подход блокировки экземпляров, даже когда они вызывают операции, которые действительно не требуют блокировки ресурсов экземпляра1003 *

Ответы [ 3 ]

6 голосов
/ 24 сентября 2010

Единственный способ сделать это - убедиться, что экземпляры классов не видны.Например, вы можете объявить это как частный вложенный класс и убедиться, что включающий класс не пропускает ссылочные экземпляры.

В принципе, если что-то может получить ссылку на экземпляр, ничего не нужноостановить его от блокировки.

Обычно достаточно убедиться, что ссылка на объект блокировки не протекает ... и не беспокоиться о видимости класса.

СЛЕДУЙТЕ ЗА - в ответ на комментарии ОП.

Вы не можете помешать чужому коду захватить блокировку экземпляра одного из ваших классов.Но вы можете спроектировать свой класс так, чтобы это не мешало внутренней синхронизации ваших классов.Просто организуйте, чтобы ваш класс использовал частный объект (даже экземпляр Object) для синхронизации.

В более общем смысле вы не можете помешать программистам приложений использовать ваши классы способами, которые вам не нравятся.Другие примеры, о которых я слышал (здесь), включают попытки заставить людей переопределить методы или предоставить конкретные конструкторы.Даже заявление о том, что ваши поля класса закрыты, не помешает решительному (или отчаявшемуся) программисту использовать рефлексию, чтобы добраться до них.

Но, с другой стороны, те вещи, которые вы пытаетесь предотвратить, могут на самом деле не быть глупыми.в конце концов.Например, может действительно быть веской причиной для приложения использовать ваш класс в качестве объекта блокировки, несмотря на ваше возражение, что это снижает параллелизм.(И в целом это так. Просто это может быть неуместно в конкретном случае.)

По моему общему мнению, это хорошая идея для документирования того, как ваш класс предназначен для использования,и разработать API, чтобы поощрять это.Но неразумно пытаться форсировать проблему.В конечном итоге ответственность за их разумное использование несут люди, которые пишут против ваших классов, а не ваши.

0 голосов
/ 24 сентября 2010

При создании нового экземпляра также создайте новый поток, который немедленно синхронизируется с экземпляром и переходит в режим сна (с Thread.sleep ()). Любой код, пытающийся синхронизироваться с экземпляром, просто заходит в тупик, поэтому разработчик должен пересмотреть свой подход.

Отказ от ответственности: Не голосуйте за меня, потому что мое предложение безумно. Я знаю, это. Я просто отвечаю на вопрос. На самом деле не делайте этого !!!

0 голосов
/ 24 сентября 2010

Если в классе есть члены, которым требуется защита от одновременного доступа, блокировка должна выполняться внутри. В противном случае вы заставляете тех, кто его использует, понять детали его реализации, когда они не смогут увидеть его интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...