     }
     
     ///
+    /// Updates the isBound value so it's current
+    ///
+    fileprivate func updateIsBound() {
+        if let isBound = _isBound {
+            isBound.value = _bindingUpdateQueue.sync { _actionsOnChanged.count > 0 };
+        }
+    }
+    
+    ///
     /// Check to see if all notifications are finished with and call doneObserving() if they are
     ///
     fileprivate func maybeDoneObserving() {
         // See if all the notifiers are finished with
         var allDone = true;
-        for notifier in _actionsOnChanged {
-            if notifier.target != nil {
-                allDone = false;
-                break;
-            }
-        }
-        
-        // Clear out eagerly if all notifiers are finished with
+        
+        // Check if we're done
+        _bindingUpdateQueue.sync {
+            for notifier in _actionsOnChanged {
+                if notifier.target != nil {
+                    allDone = false;
+                    break;
+                }
+            }
+            
+            // Clear out eagerly if all notifiers are finished with
+            if allDone {
+                _actionsOnChanged = [];
+            }
+        }
+        
+        // Notify if we're finished
         if allDone {
-            _actionsOnChanged = [];
-            _isBound?.value = false;
+            updateIsBound();
             doneObserving();
         }
     }

//

import Foundation

///
/// Protocol implemented by objects that can be notified that they need to recalculate themselves

    /// Calls a function any time this value is marked as changed
    ///
    public final func whenChangedNotify(_ target: Notifiable) -> Lifetime {
        // Record this action so we can re-run it when the value changes
        let wrapper = NotificationWrapper(target: target);
        let isFirstBinding: Bool = _bindingUpdateQueue.sync {
            _actionsOnChanged.append(wrapper);
            return _actionsOnChanged.count == 1;
        }
        
        // Perform actions if this is the first binding attached to this object
        if isFirstBinding {
            updateIsBound();
            beginObserving();
        }
        
        // Stop observing the action once the lifetime expires
        return CallbackLifetime(done: {
