public ClientLockManagerImpl(
     TCLogger logger,
     SessionManager sessionManager,
     ClientIDProvider clientIdProvider,
     RemoteLockManager remoteLockManager,
     ThreadIDManager threadManager,
     ClientLockManagerConfig config,
     TaskRunner taskRunner) {
   this.logger = logger;
   this.clientIdProvider = clientIdProvider;
   this.remoteLockManager = remoteLockManager;
   this.threadManager = threadManager;
   this.sessionManager = sessionManager;
   this.locks = new ConcurrentHashMap<LockID, ClientLock>(config.getStripedCount());
   final long gcPeriod = Math.max(config.getTimeoutInterval(), 100);
   this.gcTimer = taskRunner.newTimer("ClientLockManager LockGC");
   this.lockLeaseTimer = taskRunner.newTimer("ClientLockManager Lock Lease Timer");
   this.gcTimer.scheduleWithFixedDelay(
       new LockGcTimerTask(), gcPeriod, gcPeriod, TimeUnit.MILLISECONDS);
 }