                 // are potential receivers
                 if _name == args.busName {
                     if args.eventName == "CaravelInit" { // Reserved event name. Triggers whenReady
-                        if (!_isInitialized) {
-                            objc_sync_enter(_initializationLock)
-                            
-                            if (!_isInitialized) {
-                                _isInitialized = true
+                        if !_isInitialized {
+                            synchronized() {
+                                if !self._isInitialized {
+                                    self._isInitialized = true
                                 
-                                for i in _initializers {
-                                    dispatch_async(dispatch_get_main_queue()) {
-                                        i(self)
+                                    for i in self._initializers {
+                                        var index = self._onGoingInitializersId
+                                        
+                                        self._onGoingInitializers[index] = i
+                                        self._onGoingInitializersId++
+                                        
+                                        dispatch_async(dispatch_get_main_queue()) {
+                                            i(self)
+                                            self._onGoingInitializers.removeValueForKey(index)
+                                        }
                                     }
+                                    self._initializers = Array<(Caravel) -> Void>()
                                 }
                             }
-                            
-                            objc_sync_exit(_initializationLock)
                         }
                     } else {
                         var eventData: AnyObject? = nil

    private var _isInitialized: Bool
    
    // Multithreading locks
    private final var _initializationLock = NSObject()
    private static var _defaultInitLock = NSObject()
    private static var _namedBusInitLock = NSObject()
    
    /**
     * Pending initialization subscribers
     */
    private lazy var _initializers: [(Caravel) -> Void] = Array<(Caravel) -> Void>()
    
    private var _webView: UIWebView
    

            if let bus = getExisting() {
                return bus
            } else {
                // setWebView must be run within a synchronized block
                objc_sync_enter(Caravel._namedBusInitLock)
                if let bus = getExisting() {
                    objc_sync_exit(Caravel._namedBusInitLock)
