我正在思考语言功能,我想知道以下功能是否已用任何语言实现。
一种声明只能在互斥锁中访问对象的方法。例如,在Java中,如果对象位于同步块中并且在C#锁定中,则只能访问该对象。
如果在Mutex块之外使用该对象,则会发生编译器错误。
有什么想法吗?
更新
我认为有些人误解了这个问题,我不是在问你是否可以锁定对象,我问是否有一种机制来声明一个对象的声明它只能从一个锁中访问/同步声明。
答案 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,特别是通过允许回滚和重试来避免死锁问题。