我在思考语言特性,我想知道以下特性是否已在任何语言中实现。
一种声明对象只能在 Mutex 中访问的方法。所以例如在java中你只能访问一个对象,如果它在一个同步块中并且在C#中是一个锁。
如果在 Mutex 块之外使用该对象,则会出现编译器错误。
有什么想法吗?
更新
我认为有些人误解了这个问题,我不是在问你是否可以锁定对象,我是在问是否有一种机制可以在声明对象时声明它只能从锁定/同步语句中访问。
我在思考语言特性,我想知道以下特性是否已在任何语言中实现。
一种声明对象只能在 Mutex 中访问的方法。所以例如在java中你只能访问一个对象,如果它在一个同步块中并且在C#中是一个锁。
如果在 Mutex 块之外使用该对象,则会出现编译器错误。
有什么想法吗?
更新
我认为有些人误解了这个问题,我不是在问你是否可以锁定对象,我是在问是否有一种机制可以在声明对象时声明它只能从锁定/同步语句中访问。
有两种方法可以做到这一点。
您的程序要么拒绝运行方法,除非保护互斥锁被调用线程(即 a runtime check
)锁定;或者它拒绝编译(那是 a compile time check
)。
第一种方法是做什么C# lock
。
第二种方法要求编译器能够评估每个可能的执行路径。这几乎是不可行的。
在 Java 中,您可以将synchronized
关键字添加到方法中,但这只是将整个方法体包装在synchronized(this)
-block 中的语法糖(对于非静态方法)。
因此,对于 Java,没有强制执行该行为的语言结构。您可以尝试.wait()
使用零超时来确保调用代码已获取监视器,但这只是事后检查
在 Objective-C 中,您可以使用@property
and@synthesize
指令让编译器为访问器生成代码。默认情况下,它们受互斥锁保护。
如您所描述的那样要求对所有事物进行锁定会产生死锁的可能性,因为可能会被迫比其他人更快地获得锁定。
也就是说,有一些类似于您所描述的方法 - Software Transactional Memory特别是通过允许回滚和重试来避免死锁问题。