Little more refactoring and changing the notion of locking to be semaphore based to lock/unlock and let concrete class decide what those terms mean