public virtual void TestStats()
        {
            l.Lock();
            Assert.IsTrue(l.IsLocked());
            Assert.IsTrue(l.IsLockedByCurrentThread());
            Assert.AreEqual(1, l.GetLockCount());
            l.Unlock();
            Assert.IsFalse(l.IsLocked());
            Assert.AreEqual(0, l.GetLockCount());
            Assert.AreEqual(-1L, l.GetRemainingLeaseTime());
            l.Lock(1, TimeUnit.MINUTES);
            Assert.IsTrue(l.IsLocked());
            Assert.IsTrue(l.IsLockedByCurrentThread());
            Assert.AreEqual(1, l.GetLockCount());
            Assert.IsTrue(l.GetRemainingLeaseTime() > 1000 * 30);

            CountdownEvent latch2 = new CountdownEvent(1);

            var t2 = new Thread(delegate(object o)
            {
                Assert.IsTrue(ClientLockTest.l.IsLocked());
                Assert.IsFalse(ClientLockTest.l.IsLockedByCurrentThread());
                Assert.AreEqual(1, ClientLockTest.l.GetLockCount());
                Assert.IsTrue(ClientLockTest.l.GetRemainingLeaseTime() > 1000 * 30);
                latch2.Signal();
            });

            t2.Start();

            Assert.IsTrue(latch2.Wait(TimeSpan.FromMinutes(1)));
        }