Единственный способ сделать это - убедиться, что экземпляры классов не видны.Например, вы можете объявить это как частный вложенный класс и убедиться, что включающий класс не пропускает ссылочные экземпляры.
В принципе, если что-то может получить ссылку на экземпляр, ничего не нужноостановить его от блокировки.
Обычно достаточно убедиться, что ссылка на объект блокировки не протекает ... и не беспокоиться о видимости класса.
СЛЕДУЙТЕ ЗА - в ответ на комментарии ОП.
Вы не можете помешать чужому коду захватить блокировку экземпляра одного из ваших классов.Но вы можете спроектировать свой класс так, чтобы это не мешало внутренней синхронизации ваших классов.Просто организуйте, чтобы ваш класс использовал частный объект (даже экземпляр Object
) для синхронизации.
В более общем смысле вы не можете помешать программистам приложений использовать ваши классы способами, которые вам не нравятся.Другие примеры, о которых я слышал (здесь), включают попытки заставить людей переопределить методы или предоставить конкретные конструкторы.Даже заявление о том, что ваши поля класса закрыты, не помешает решительному (или отчаявшемуся) программисту использовать рефлексию, чтобы добраться до них.
Но, с другой стороны, те вещи, которые вы пытаетесь предотвратить, могут на самом деле не быть глупыми.в конце концов.Например, может действительно быть веской причиной для приложения использовать ваш класс в качестве объекта блокировки, несмотря на ваше возражение, что это снижает параллелизм.(И в целом это так. Просто это может быть неуместно в конкретном случае.)
По моему общему мнению, это хорошая идея для документирования того, как ваш класс предназначен для использования,и разработать API, чтобы поощрять это.Но неразумно пытаться форсировать проблему.В конечном итоге ответственность за их разумное использование несут люди, которые пишут против ваших классов, а не ваши.