2013-09-29 5 views
9

이 코드는 스레드로부터 안전한가요?RxJava 스레드 안전성

Observable<String> observable = ... // some observable that calls 
            // onNext from a background thread 

observable 
    .scan(new ArrayList<String>(), (List<String> acc, String next) -> { 
    acc.add(next); 
    return acc; 
    }) 
    .subscribe(list -> { 
    // do somethind with sequence of lists 
    ... 
    }); 

ArrayList는 스레드로부터 안전한 데이터 구조가 아니기 때문에 궁금합니다.

+0

Rx 디자인 지침이 유용합니다. http://go.microsoft.com/fwlink/?LinkID=205219 –

+0

[RxJava의 스레드 안전성을 위해 SerializedSubject가 필요하다] (RxJava의 http://stackoverflow.com/questions/31841809/is-serializedsubject-necessary-for-thread-safety-in-rxjava) –

답변

6

빠른 답변으로, .NET (원본 Rx 구현)에서 관찰 가능한 시퀀스의 모든 값은 순차적이라고 가정 할 수 있습니다. 이것은 다중 스레드가되는 것을 배제하지 않습니다. 그러나 다중 스레드 방식으로 값을 생성하는 경우 .NET Synchronize() Rx 연산자와 동일한 기능을 찾아 순차적 성격을 적용 할 수 있습니다.

또 다른 옵션은 RxJava 소스 코드에서 Scan의 구현을 검사하여 누적 기 기능에서 사용자에게 안전을 제공하려는 순차적 특성을 적용하는지 확인하는 것입니다.

+0

RxJava에서'scan' .Net 원래 버전과 정확히 동일합니다. – allprog

+0

건배. 나는 시간이 지남에 따라 .NET과 Java 코드베이스가 동일 할 것이라고 확신하지 못한다고 주로 말합니다. –

4

이 코드가 스레드로부터 안전하지 않으면 RxJava가 손상되었거나 관찰 가능한 소스가 손상되었습니다. 재진입 중이 지 않은 연산자는 Rx 계약의 일부입니다.

+0

RxJava가 실제로 그것을 구현했다면 Rx의'Checked()'옵저버 연산자로 이것을 적용 할 수 있습니다. 당겨 요, 누구 요? –

+0

블록에 대한 스레드 안전은 제 생각에는 그렇게 간단하지 않습니다. 게시물에 표시된 코드에는 자세한 내용이 포함되어 있지 않습니다. @orionll이 알지 못했던 것은 기본적으로 구독이 동 기적으로 전달된다는 것입니다. 그러나 비동기 구독으로 변환 된 경우 배열 목록에 액세스하는 것이 더 이상 안전하지 않습니다. – allprog

+1

@allprog 이것은 간단하지는 않지만, Rx의 장점 중 하나입니다.이 기능을 통해 무언가를 안전하게 만들어줍니다. –