我正在阅读级联文档第5.2章的函数,我想知道下面的代码会发生什么。它应该在多线程环境中正常工作吗?更一般的问题是函数可以是多线程的吗?据我所知,单Map器是单线程的。
具体来说,我已经测试过这样的代码,在我看来这不是线程安全的。可能我没有正确理解第(39)页上的文档。
public class NotThreadSafeObject{
...
public void doSomething(){
// update state
}
public String getValue(){
// returns value from state
}
public class SomeFunction extends BaseOperation<Tuple> implements Function<Tuple>
{
// constructors
@Override
public void prepare( FlowProcess flowProcess, OperationCall<Tuple> call )
{
// create a reusable Object with state of size 1
call.setContext( new NotThreadSafeObject() );
}
public void operate( FlowProcess flowProcess, FunctionCall<Tuple> call )
{
// ...
NotThreadSafeObject obj = call.getContext();
obj.doSomething();
Tuple tup = new Tuple();
tup.set(0,obj.getValue());
call.getOutputCollector().add(tup);
}
@Override
public void cleanup( FlowProcess flowProcess, OperationCall<Tuple> call )
{
call.setContext( null );
}
}
1条答案
按热度按时间ffscu2ro1#
基于级联文档,这应该可以很好地工作,事实上这是在非聚合操作中使用上下文的主要原因。