定义还是不定义@groovy
有一个groovy脚本,它定义了一个函数并在多个线程中使用。 我发现有时它会将一些变量值与其他线程混合。 当开发人员忘记像这样声明变量时,就会出现问题:定义还是不定义@groovy,groovy,function,Groovy,Function,有一个groovy脚本,它定义了一个函数并在多个线程中使用。 我发现有时它会将一些变量值与其他线程混合。 当开发人员忘记像这样声明变量时,就会出现问题: def f ( x ) { y = "" + x println y } 当开发人员声明变量时,问题就消失了 def f ( x ) { def y = "" + x println y } 在类中,无法使用未定义的变量 原因是在脚本中,未定义的变量充当脚本类的实例变量。实际上,这是可以传递到脚本中的外部变量的绑定 下面是脚
def f ( x ) {
y = "" + x
println y
}
当开发人员声明变量时,问题就消失了
def f ( x ) {
def y = "" + x
println y
}
在类中,无法使用未定义的变量
原因是在脚本中,未定义的变量充当脚本类的实例变量。实际上,这是可以传递到脚本中的外部变量的绑定
下面是脚本的一部分,它演示了在多个线程中使用未定义变量的问题
void f(String x){
y=""+x; //if you put def at this line it'll work fine
Thread.sleep(333);
//usually developers expected that `y` is a local variable,
//but without declaration it belongs to script-class
if( !y.equals(x) ) println("failure: x=$x y=$y");
}
//thead 1 start
Thread.start{
for(int i=0;i<20;i++){
f( i.toString() )
Thread.sleep(100);
}
}
//thead 2 start
Thread.start{
for(int i=0;i<20;i++){
f( i.toString() )
Thread.sleep(150);
}
}
//main thread sleep.
Thread.sleep(2000);
println("done");
void f(字符串x){
y=”“+x;//如果您将def放在这一行,它将正常工作
睡眠(333);
//通常开发人员希望'y'是一个局部变量,
//但没有声明,它属于脚本类
如果(!y.equals(x))println(“失败:x=$x y=$y”);
}
//thead 1开始
Thread.start{
对于(inti=0;i而言,这里将其描述为“绑定”
使用scriptBaseClass
编写编译器配置,以禁止未声明的变量和使用脚本自身的绑定
这是基本脚本(mydeffase.groovy
文件):
和脚本。如果setProperty
尝试使用绑定,它将抛出一个AssertionError
:
void f(String x){
y=""+x; //if you put def at this line it'll work fine
Thread.sleep(333);
if( !y.equals(x) ) println("failure: x=$x y=$y");
}
def t1 = Thread.start{
20.times { i ->
f( i.toString() )
Thread.sleep(100);
}
}
def t2 = Thread.start{
20.times { i ->
f( i.toString() )
Thread.sleep(150);
}
}
Thread.sleep(2000);
t1.join()
t2.join()
println("done");
看起来你已经发现了问题所在。那么为什么要问是否定义的问题呢?
void f(String x){
y=""+x; //if you put def at this line it'll work fine
Thread.sleep(333);
if( !y.equals(x) ) println("failure: x=$x y=$y");
}
def t1 = Thread.start{
20.times { i ->
f( i.toString() )
Thread.sleep(100);
}
}
def t2 = Thread.start{
20.times { i ->
f( i.toString() )
Thread.sleep(150);
}
}
Thread.sleep(2000);
t1.join()
t2.join()
println("done");