我正在实现 SerializableFunction 接口,我想重用我在构造函数中创建的一些昂贵的辅助对象。在数据流作业中使用此类时,是否为每个使用它的线程创建/克隆了一个新实例?
谢谢, 格纳迪
我正在实现 SerializableFunction 接口,我想重用我在构造函数中创建的一些昂贵的辅助对象。在数据流作业中使用此类时,是否为每个使用它的线程创建/克隆了一个新实例?
谢谢, 格纳迪
简短答案
SerializableFunction 不需要是线程安全的,因为每个线程都有自己的反序列化实例。它在共享范围内访问的任何引用(例如,通过静态方法/静态引用/...)都需要是线程安全的。
长答案
SerializableFunction 使用 Java 的对象序列化机制进行序列化,并保存为 Dataflow 规范的一部分。根据规范及其优化方式,SerializableFunction 很可能会分解为多个工作单元。然后,每台工作机器可以请求它们并行处理的 1 个或多个工作单元。每个工作单元都将使用 Java 的对象序列化机制来重新创建 SerializableFunction 的实例。每个线程只分配给一个工作单元。请注意,即使每个工作单元都分配给一个线程,如果昂贵的辅助对象不是 SerializableFunction 的一部分,而是通过另一种方法(例如通过静态引用/方法)访问,