docs: protected EJSDeployedSupport lockSingleton() {
          final boolean isTraceOn = TraceComponent.isAnyTracingEnabled();
          if (isTraceOn && tc.isEntryEnabled())
              Tr.entry(tc, "lockSingleton: " + this);
  
          EJSHome home;
          EJSDeployedSupport s = null;
  
          try {
              // Get the currently installed and active home for this timer.
              home = EJSContainer.getDefaultContainer().getInstalledHome(j2eeName);
          } catch (EJBNotFoundException ejbnfex) {
              FFDCFilter.processException(ejbnfex, CLASS_NAME + ".lockSingleton", "305", this);
              if (isTraceOn && tc.isEntryEnabled())
                  Tr.exit(tc, "lockSingleton: Failed locating timer bean " + j2eeName + " : " + ejbnfex);
              throw new TimerServiceException("Failed locating timer bean " + j2eeName, ejbnfex);
          }
  
          // Calling BeanO.preInvoke to obtain a lock is only needed for singleton beans with
          // container managed concurrency that have been configured to run in a global transaction.
  
          if (home.ivSingletonSessionHome && !home.beanMetaData.ivSingletonUsesBeanManagedConcurrency) {
              EJBMethodInfoImpl[] timerMethodInfos = home.beanMetaData.timedMethodInfos;
              if (timerMethodInfos != null && methodId < timerMethodInfos.length) {
                  if (runInGlobalTransaction(timerMethodInfos[methodId])) {
                      s = new EJSDeployedSupport();
                      s.methodId = methodId;
                      s.methodInfo = timerMethodInfos[methodId];
                      s.beanO = home.createSingletonBeanO();
                      try {
                          s.beanO.preInvoke(s, null);
                      } catch (Throwable ex) {
                          FFDCFilter.processException(ex, CLASS_NAME + ".lockSingleton", "403", this);
                          if (isTraceOn && tc.isDebugEnabled())
                              Tr.debug(tc, "Unexpected failure calling beanO.preInvoke: " + ex);
                          try {
                              s.beanO.postInvoke(methodId, s);
                          } catch (Throwable exPost) {
                              FFDCFilter.processException(exPost, CLASS_NAME + ".lockSingleton", "409", this);
                              if (isTraceOn && tc.isDebugEnabled())
                                  Tr.debug(tc, "Unexpected failure calling beanO.postInvoke: " + exPost);
                          }
                          if (isTraceOn && tc.isEntryEnabled())
                              Tr.exit(tc, "lockSingleton: Failure acquiring lock for bean " + j2eeName + " : " + ex);
                          throw ExceptionUtil.EJBException("Failure acquiring lock for bean " + j2eeName, ex);
                      }
                  }
              } else {
                  // The run() method will report this as an error later
                  if (isTraceOn && tc.isDebugEnabled())
                      Tr.debug(tc, "Timer method no longer present on bean??");
              }
          } else {
              if (isTraceOn && tc.isDebugEnabled())
                  Tr.debug(tc, "not a container managed concurrency singleton bean");
          }
  
          if (isTraceOn && tc.isEntryEnabled())
              Tr.exit(tc, "lockSingleton: " + s);
          return s;
      }