如前所述,lambda可以被缓存。在多线程环境中,如果我们运行下面的代码,会不会是thread1用一个参数“appple”开始执行foo方法,然后停止,比如在我们微笑连接字符串的那一行,然后thread2用一个“orange”参数进入并执行所有操作,然后thread1醒来并继续,但不是把“苹果”连在一起,而是把“橘子”连在一起,带着微笑?
static void foo(String s){
Consumer<String> consumer = string -> {
string = string.toUpperCase();
string = string + ":)";
System.out.println(string);
};
consumer.accept(s);
}
上下文(但其实并不重要):
我想使用lambdas将策略存储在抽象工厂中,而不是像旧式gof书中那样的类示例(通过这种方式,我可以为客户机代码提供一个api,如果他们愿意,可以在其中内联一些短lambda,而不是从工厂获取更长的lambda。)但是如果我使用“return new strategy1()”返回一个策略,那么该示例可以是线程安全的,因为每个线程都可以获得自己的示例。但是如果像这样的返回:“returns->s.touppercase()”这个lambda可以被缓存。
2条答案
按热度按时间q9yhzks01#
不,那是不可能的。实际上,这最终会成为一个方法,您所说的任何“缓存”都是缓存整个类,而不仅仅是这个lambda,而且只是缓存代码,而不是任何参数。
az31mfrm2#
lambda的调用与方法调用的工作原理相同,即主体中的局部变量和特定于调用的参数。多个调用不共享局部变量和参数。因此-就像方法一样-除非lambda是有状态的(即,在lambda之外的字段或对象中修改或存储),否则对同一lambda的多个调用不会产生干扰,并且是线程安全的。