Java lambdas线程安全



正如我之前读到的,可以缓存lambdas。在多线程环境中,如果我们运行以下代码,是否会出现Thread1以参数"开始执行foo方法的情况;appple";然后停下来,比方说在我们微笑连接字符串的那一行,然后Thread2出现了一个";橙色";参数并执行所有内容,然后Thread1唤醒并继续,但不是连接";苹果;其连接一个";橙色";带着微笑?

static void foo(String s){
Consumer<String> consumer = string -> {
string = string.toUpperCase();
string = string + ":)";
System.out.println(string);
};
consumer.accept(s);
}

上下文(但这并不重要(:
我想使用lambdas将Strategies存储在AbstractFactory中,而不是像老派GoF书中那样的类实例。(通过这种方式,我可以为客户端代码提供一个API,如果他们愿意,他们可以内联一些短的lambdas,而不是从工厂获得我的长的lambdas.(但如果我返回一个策略;return new Strategy1(("那么该实例可以是线程安全的,因为每个线程都可以获得自己的实例。但如果一个回报是这样的:;返回s->s.toUpperCase((";可以缓存此lambda。

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

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

最新更新