1

我在 .gs 类中有以下函数,该函数在访问特定的声明信息时被调用 -

public static function testVisibility(claim : Claim) : boolean {
    if(claim.State == ClaimState.TC_OPEN){
        return true;
    }
    else{
        return false;
    }
}

我的问题 -

a) 如果两个用户正在访问他们各自的 Claims 信息,这个函数应该被调用两次——第一次它应该接收第一个用户的 Claim 实例,第二次它应该接收第二个用户的 Claim 实例。如果同时访问 - 是否会调用同一函数的两个副本?不应该是这样,因为静态函数只是一个副本。那么,如果是一个副本,如何保证线程安全呢?该函数会被一个接一个地调用吗?

b) 像 Java 一样,Gosu 是否也使用 Heap 来运行静态函数?

4

2 回答 2

4

您似乎对这里的定义有些困惑。线程安全只是为了保护线程间共享数据的完整性而创建的一种机制。因此,您的示例函数是线程安全的,无论它是否是静态的。

a) 由于上述原因,这里不会出现线程安全问题,因为您正在使用 2 组不同的数据

b) 如果 Gosu 是为在 JVM 上运行并生成 .class 文件而构建的,我相信在大多数情况下(如果不是 100%,除了语法之外)它表现得像 Java。

于 2015-05-27T01:18:31.583 回答
3

当我们开始喜欢任何编程语言时,这都是陈词滥调。

考虑恰好在特定时间点访问 Web 应用程序的 100 人,在这里,根据您的疑问,静态变量/函数将为所有 100 人返回/共享内容值。事实是,这里不会发生数据共享,因为对于每个服务器连接,都会创建每个单独的 THREAD,并且整个应用程序都在该线程上工作(称为每个连接一个线程)。

因此,如果有一个静态/全局变量,该特定变量将在 100 个不同的线程上工作,并且每个线程的内容/数据将是安全的,并且不能从其他线程(直接)访问。这就是 Web 应用程序的工作方式。

如果我们需要在线程之间共享一些变量/类,我们必须使其成为单例。例如,对于数据库连接,如果已经建立了连接,我们不需要一直创建连接。在这种情况下,连接类将是单例的。

希望这是有道理的。:)

-阿拉文德

于 2018-01-24T05:28:17.760 回答