Объект должен быть заблокирован для использования? - PullRequest
1 голос
/ 03 февраля 2009

Я размышлял над особенностями языка, и мне было интересно, была ли реализована следующая функция на каких-либо языках.

Способ объявить, что доступ к объекту возможен только внутри мьютекса. Так, например, в Java вы сможете получить доступ к объекту, только если он находится в синхронизированном блоке, а в C # - Блокировка.

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

Есть мысли?

UPDATE

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

Ответы [ 4 ]

1 голос
/ 03 февраля 2009

Есть два способа сделать это.

Ваша программа либо отказывается запускать метод, если только защитный мьютекс не заблокирован вызывающим потоком (это runtime check); или он отказывается компилировать (это compile time check).

Первый путь - это то, что делает C# lock.

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

0 голосов
/ 06 августа 2009

Требование блокировок для всего, что вы описываете, может привести к возникновению взаимоблокировок, поскольку вы можете быть вынуждены взять блокировку раньше, чем в противном случае.

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

0 голосов
/ 03 февраля 2009

В Objective-C вы можете использовать директивы @property и @synthesize, чтобы позволить компилятору генерировать код для методов доступа. По умолчанию они защищены мьютексом.

0 голосов
/ 03 февраля 2009

В Java вы можете добавить ключевое слово synchronized к методу, но это всего лишь синтаксический сахар для переноса всего тела метода в synchronized(this) -блок (для нестатических методов).

Так что для Java не существует языковой конструкции, обеспечивающей такое поведение. Вы можете попробовать .wait() на этом с нулевым тайм-аутом, чтобы убедиться, что вызывающий код получил монитор, но это просто проверка по факту

...