2009-02-03 2 views
1

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

Способ объявления того, что объект может быть доступен только в пределах Mutex. SO, например, в java, вы сможете получить доступ только к объекту, если он был в синхронизированном блоке, а в C# a Lock.

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

Любые мысли?

UPDATE

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

ответ

0

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

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

0

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

1

Существует два способа сделать это.

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

Первый способ - это C# lock.

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

0

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

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

Смежные вопросы