定义还是不定义@groovy

定义还是不定义@groovy,groovy,function,Groovy,Function,有一个groovy脚本,它定义了一个函数并在多个线程中使用。 我发现有时它会将一些变量值与其他线程混合。 当开发人员忘记像这样声明变量时,就会出现问题: def f ( x ) { y = "" + x println y } 当开发人员声明变量时,问题就消失了 def f ( x ) { def y = "" + x println y } 在类中,无法使用未定义的变量 原因是在脚本中,未定义的变量充当脚本类的实例变量。实际上,这是可以传递到脚本中的外部变量的绑定 下面是脚

有一个groovy脚本,它定义了一个函数并在多个线程中使用。 我发现有时它会将一些变量值与其他线程混合。 当开发人员忘记像这样声明变量时,就会出现问题:

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
编写编译器配置,以禁止未声明的变量和使用脚本自身的绑定

这是基本脚本(my
deffase.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");