1

我在思考语言特性,我想知道以下特性是否已在任何语言中实现。

一种声明对象只能在 Mutex 中访问的方法。所以例如在java中你只能访问一个对象,如果它在一个同步块中并且在C#中是一个锁。

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

有什么想法吗?

更新

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

4

4 回答 4

1

有两种方法可以做到这一点。

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

第一种方法是做什么C# lock

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

于 2009-02-03T13:03:02.980 回答
0

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

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

于 2009-02-03T12:58:51.757 回答
0

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

于 2009-02-03T13:00:46.353 回答
0

如您所描述的那样要求对所有事物进行锁定会产生死锁的可能性,因为可能会被迫比其他人更快地获得锁定。

也就是说,有一些类似于您所描述的方法 - Software Transactional Memory特别是通过允许回滚和重试来避免死锁问题。

于 2009-08-06T04:03:52.570 回答