必须锁定对象才能使用?

时间:2009-02-03 12:54:00

标签: thread-safety language-features mutex

我正在思考语言功能,我想知道以下功能是否已用任何语言实现。

一种声明只能在互斥锁中访问对象的方法。例如,在Java中,如果对象位于同步块中并且在C#锁定中,则只能访问该对象。

如果在Mutex块之外使用该对象,则会发生编译器错误。

有什么想法吗?

更新

我认为有些人误解了这个问题,我不是在问你是否可以锁定对象,我问是否有一种机制来声明一个对象的声明它只能从一个锁中访问/同步声明。

4 个答案:

答案 0 :(得分:1)

有两种方法可以做到。

你的程序要么拒绝运行一个方法,除非保护互斥锁被调用线程锁定(那是runtime check);或者它拒绝编译(那是compile time check)。

第一种方式是C# lock的作用。

第二种方法要求编译器能够评估每个可能的执行路径。这几乎不可行。

答案 1 :(得分:0)

在Java中,您可以将synchronized关键字添加到方法中,但这只是将整个方法体包装在synchronized(this) - 块中的语法糖(对于非静态方法)。

因此,对于Java,没有强制执行该行为的语言构造。您可以尝试.wait()以零超时来确保调用代码已获取监视器,但这只是在事后检查

答案 2 :(得分:0)

在Objective-C中,您可以使用@property@synthesize指令让编译器为访问器生成代码。默认情况下,它们受互斥锁保护。

答案 3 :(得分:0)

如你所描述的那样要求锁定所有内容会产生死锁的可能性,因为人们可能会被迫比其他人更快地锁定。

尽管如此,有些方法与您描述的类似 - Software Transactional Memory,特别是通过允许回滚和重试来避免死锁问题。