         if name == "default" {
             return getDefault(webView)
         } else {
-            var newBus: Caravel?
+            let getExisting = { () -> Caravel? in
+                for b in self._buses {
+                    if b.name == name {
+                        b.setWebView(webView)
+                        return b
+                    }
+                }
+                
+                return nil
+            }
             
-            for b in _buses {
-                if b.name == name {
-                    b.setWebView(webView)
-                    return b
+            if let bus = getExisting() {
+                return bus
+            } else {
+                objc_sync_enter(Caravel._namedBusInitLock)
+                if let bus = getExisting() {
+                    objc_sync_exit(Caravel._namedBusInitLock)
+                    return bus
+                } else {
+                    var newBus = Caravel(name: name, webView: webView)
+                    _buses.append(newBus)
+                    objc_sync_exit(Caravel._namedBusInitLock)
+                    return newBus
                 }
             }
-            
-            newBus = Caravel(name: name, webView: webView)
-            _buses.append(newBus!)
-            return newBus!
         }
     }
 }
     * Returns the default bus
     */
    public static func getDefault(webView: UIWebView) -> Caravel {
        if let d = _default {
            d.setWebView(webView)
            return d
        } else {
            _default = Caravel(name: "default", webView: webView)
            return _default!
        }
    }
    

    
    
    /**
     * Denotes if the bus has received the init event from JS
     */
    private var _isInitialized: Bool
    
    // Multithreading locks
    private final var _initializationLock = NSObject()
    private static var _defaultInitLock = NSObject()
    private static var _namedBusInitLock = NSObject()
    
    /**
     * Pending initialization subscribers
