code: @Override
      public Injector getInjector() {
          
          // fetch instance variable into method, so that we access the volatile
          // global variable only once - that's better performance wise.
          Bootstrap ninjaBootstrapLocal = ninjaBootstrap;
          
          if (ninjaBootstrapLocal == null) {
  
              synchronized(this) {
                  
                  ninjaBootstrapLocal = ninjaBootstrap;
                  
                  if (ninjaBootstrapLocal == null) {
                      
                      // if properties 
                      if (ninjaProperties == null) {
                          
                          ninjaProperties 
                                  = new NinjaPropertiesImpl(
                                          NinjaModeHelper.determineModeFromSystemPropertiesOrProdIfNotSet());
                      
                      }
                  
                      ninjaBootstrap 
                              = createNinjaBootstrap(ninjaProperties, contextPath);
                      ninjaBootstrapLocal = ninjaBootstrap;
  
                  }
              
              }
          
          }
          
          return ninjaBootstrapLocal.getInjector();
  
      }
docs: Getting the injector is done via double locking in conjuction
  with volatile keyword for thread safety.
  See also: http://en.wikipedia.org/wiki/Double-checked_locking
  
  @return The injector for this application.