     }
     
     func on(event: Event<E>) {
-        switch event {
-        case .Next:
-            if _forwardElements {
-                _observer?.on(event)
+        _lock.performLocked {
+            switch event {
+            case .Next:
+                if _forwardElements {
+                    _observer?.on(event)
+                }
+            case .Error:
+                observer?.on(event)
+                dispose()
+            case .Completed:
+                if _forwardElements {
+                    _observer?.on(event)
+                }
+                _singleAssignmentDisposable.dispose()
             }
-        case .Error:
-            observer?.on(event)
-            dispose()
-        case .Completed:
-            if _forwardElements {
-                _observer?.on(event)
-            }
-            _singleAssignmentDisposable.dispose()
         }
     }
     

    }

    func on(event: Event<E>) {
        // Do we need lock here?
        _parent.lock.performLocked {
            switch event {
            case .Next:
                _parent._forwardElements = true
                _singleAssignmentDisposable.dispose()
            case .Error(let e):
                _parent._observer?.onError(e)
                _parent.dispose()
            case .Completed:
                _singleAssignmentDisposable.dispose()
            }
        }
    }
    

    typealias E = ElementType
    typealias Parent = SkipUntil<E, Other>
    
    private let _lock = NSRecursiveLock()
    private let _parent: Parent
    private var _forwardElements = false
    
