同时从多个线程使用同一FluxSink是否安全?

时间:2018-09-28 15:56:02

标签: java spring concurrency project-reactor reactive-streams

我知道Publisher不能同时发布,但是如果我使用Flux#create(FluxSink),可以安全地同时调用FluxSink#next吗?

换句话说,即使FluxSink#next被同时调用,Spring是否具有内部魔术来确保适当的事件串行发布?

public class FluxTest {

    private final Map<String, FluxSink<Item>> sinks = new ConcurrentHashMap<>();

    // Store a new sink for the given ID
    public void start(String id) {
        Flux.create(sink -> sinks.put(id, sink));
    }

    // Called from different threads
    public void publish(String id, Item item) {
        sinks.get(id).next(item); //<----------- Is this safe??
    }
}

像官方指南中的this paragraph一样听起来对我来说表明上述内容确实是安全的,但我对自己的理解并不十分自信。

  

create是程序创建Flux的一种更高级形式,适用于每轮多次排放,甚至来自多个线程。

1 个答案:

答案 0 :(得分:2)

是的,Flux.create产生了一个SerializedSink,可以安全地从多个线程使用 @Override public void onPause() { super.onPause(); MemoryClass.value1 = editText1.getText().toString(); } @Override public void onResume() { super.onResume(); editText1.setText(MemoryClass.value1); } 调用