Java lambdas线程安全

Java lambdas线程安全,java,multithreading,lambda,thread-safety,Java,Multithreading,Lambda,Thread Safety,如前所述,lambda可以缓存。在多线程环境中,如果我们运行以下代码,Thread1是否会使用参数“appple”开始执行foo方法,然后停止执行,比如在我们用微笑连接字符串的那一行,然后Thread2使用一个“橙色”参数进入并执行所有操作,然后Thread1醒来并继续执行,但是,不是把“苹果”和它的微笑连在一起,而是把“橙色”和微笑连在一起 static void foo(String s){ Consumer<String> consumer = string -> {

如前所述,lambda可以缓存。在多线程环境中,如果我们运行以下代码,Thread1是否会使用参数“appple”开始执行foo方法,然后停止执行,比如在我们用微笑连接字符串的那一行,然后Thread2使用一个“橙色”参数进入并执行所有操作,然后Thread1醒来并继续执行,但是,不是把“苹果”和它的微笑连在一起,而是把“橙色”和微笑连在一起

static void foo(String s){
  Consumer<String> consumer = string -> {
    string = string.toUpperCase();
    string = string + ":)";
    System.out.println(string);
  };
  consumer.accept(s);
}
静态void foo(字符串s){
消费者=字符串->{
string=string.toUpperCase();
字符串=字符串+“:)”;
System.out.println(字符串);
};
消费者。接受;
}
上下文(但其实并不重要):

我希望使用lambdas将策略存储在抽象工厂中,而不是像旧式GoF书籍中那样的类实例。(通过这种方式,我可以为客户端代码提供一个API,如果他们愿意,可以内联一些短lambda,而不是从工厂获取更长的lambda。)但是如果我使用“return new Strategy1()”返回一个策略,那么该实例可以是线程安全的,因为每个线程都可以获得自己的实例。但是如果像这样的返回:“returns->s.toUpperCase()”这个lambda可以被缓存。

不,这是不可能的。实际上,这最终将成为一个方法,您所说的任何“缓存”都是[a]缓存整个类,而不仅仅是这个lambda,并且[B]只是代码的缓存,而不是任何参数。

lambda的调用与方法调用的工作原理相同,即主体中的局部变量,参数特定于调用。多个调用不共享局部变量和参数。因此,与方法一样,除非lambda是有状态的(即,修改或存储在lambda之外的字段或对象中),否则对同一lambda的多次调用不会产生干扰,并且是线程安全的。

只有可以共享的内容才会被缓存。如果lambda捕获了任何内容,那么将为每个线程分配一个新实例。否则,即使共享实际实例也没有坏处。