2015-04-22 228 views
0

我有以下功能在.GS类,访问特定索赔信息时被调用 -静态方法

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

我的问题 -

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

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

+0

什么是“Gosu”? – gnat

+0

Gosu是一种基于JVM构建的通用编程语言,通常用于Guidewire工具。 –

回答

3

看来你对这里的定义有点混淆了。 线程安全只是一种机制,用于保护线程之间共享的数据的完整性。因此,你的示例函数是线程安全的,不管它是否是静态的。

a)由于上述原因,这里不存在线程安全问题,因为您正在使用2组不同的数据集。 b)假设Gosu是构建在JVM上运行并生成.class文件的,我相信绝大部分(如果不是100%,除语法外),的行为与Java相似。

0

当我们开始喜欢任何编程语言时,这是一种老生常谈的混淆。

考虑100个人在特定的时间点准确访问网络应用程序,这里根据您的疑问,静态变量/函数将返回/共享所有100个人的内容值。 事实是,数据共享不会发生在这里,因为每个服务器连接都会创建每个单独的THREAD,并且整个应用程序在该线程上工作(称为每个连接一个线程)。如果有一个静态/全局变量,那个特定的变量将在100个不同的线程上工作,并且每个线程的内容/数据将是安全的,并且不能从其他线程(直接)访问。这是Web应用程序的工作原理。

如果我们需要在线程中共享一些变量/类,我们必须使它成为单例。 例如,对于数据库连接,如果已经存在已建立的连接,则不需要始终创建连接。在这种情况下,连接类将是单身人士。

希望这是有道理的。 :)

-Aravind