首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8 Lambdas和并发性解释

Java 8 Lambdas和并发性解释
EN

Stack Overflow用户
提问于 2016-01-16 14:10:17
回答 2查看 1K关注 0票数 3

我正在阅读理查德·沃伯顿()所著的“Java 8 lambdas”(Java 8 Lambdas )一书中有关兰巴斯的内容。他开始讨论现代CPU中的并发性,并最终将其与lambda联系起来。我不知道我错过了什么,但我肯定不明白这个概念。考虑下一节课

代码语言:javascript
复制
class A {

private int state;

A(){
    state = 0;
}

A(int state){
    this.state = state;
}

public int getState() {
    return state;
}

public void setState(int state) {
    this.state = state;
}

@Override
public String toString() {
    return Integer.toString(state);
}
} // end A

public class Main {

public static void main(String[] args) {

    List<A> ls = new ArrayList<>();

    ls.add(new A(2));
    ls.add(new A(3));

    ls.forEach( a -> a.setState(a.getState() + 1) );
    System.out.println(ls); // [3, 4]

} // end main

} // end class Main

这个构造ls.forEach( a -> a.setState(a.getState() + 1) );如何更适合并发编程

代码语言:javascript
复制
ls.forEach(new Consumer<A>() {

        @Override
        public void accept(A t) {
            t.setState(t.getState() + 1);
        }
    });
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-16 14:21:31

从开发人员的角度来看,java编译器刚刚将第一个lambda示例扩展到您提供的第二个代码示例。Lambdas基本上创建一个匿名内部类,当且仅当函数的参数需要一个带有一个未知方法的接口。

实际的Java8实现略有不同,因为它们不想生成大量的类文件,因此在运行时通过使用invokedynamic绑定私有方法( lambda代码)来创建实现类。戈茨的一些注释还提到,运行时可能存在一些缓存优化透明性。

理论上,拥有库实现知识的优化编译器可以做一些聪明的事情,但这从来不是java编译器的工作方式,主要是因为java源代码编译器通常与运行时分离。( invokedynamic部分确实提供了一些透明度,但在库级别上没有提供)

然而,从文体上讲,使用lambda语法更简洁,也可以被看作是一个更干净的选项,因为您不会被诱惑将变量插入包含状态的内部类中。

票数 2
EN

Stack Overflow用户

发布于 2016-01-16 16:33:05

很可能lambda并不反对匿名类,但是内部迭代(使用forEach)与外部迭代(使用增强的for循环)相反。在这种情况下,这是合理的。像这样的外部迭代不能并行化:

代码语言:javascript
复制
for(A a : ls) {
    a.setState(a.getState() + 1);
}

相反,内部迭代不受限制:如果方法规范允许(例如,Stream.forEach()),只要客户端代码遵守某些规则(例如,不要修改共享状态),它就可以并行化而不更改客户端代码。从这个意义上说,内部迭代对并发性更友好。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34827898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档