예제 #1
0
        static void ZooKeeperReadWriteLockTest()
        {
            var rd = new Random();

            for (int i = 0; i < 5; i++)
            {
                Task.Factory.StartNew(() =>
                {
                    var seed = rd.Next(1, 100);
                    IDistributedLock zkLock = ((seed % 2) == 1)
                    ?
                                              new ZooKeeperWriteLock(new ZooKeeperReadWriteLockOptions()) as IDistributedLock
                    :
                                              new ZooKeeperReadLock(new ZooKeeperReadWriteLockOptions()) as IDistributedLock;

                    using (zkLock)
                    {
                        if (zkLock.Lock())
                        {
                            Thread.Sleep(1000);

                            zkLock.UnLock();
                            Trace.WriteLine("UnLock");
                        }
                        else
                        {
                            Trace.WriteLine("Get Lock Failed.");
                        }
                    }
                });
            }
        }
        public void Lock_then_modify_list()
        {
            IDistributedLock memcached = MemcachedCacheProvider.Default;
            var key = "DistributedLock1";

            {
                var list      = new List <int>();
                var except    = new Random().Next(100, 200);
                var stopwatch = Stopwatch.StartNew();

                Parallel.For(0, except, i => {
                    using (memcached.ReleasableLock(key)) {
                        list.Add(i);
                    }
                });
                stopwatch.Stop();
                Console.WriteLine("Handle {0} times cost {1}, {2:f2} per sec.",
                                  except, stopwatch.Elapsed.TotalSeconds, except / stopwatch.Elapsed.TotalSeconds);

                Assert.AreEqual(list.Count, except);
            }

            {
                var list      = new List <int>();
                var except    = new Random().Next(1000, 2000);
                var stopwatch = Stopwatch.StartNew();

                Parallel.For(0, except, i => {
                    memcached.ReleasableLock(key);
                    list.Add(i);
                    memcached.UnLock(key);
                });

                stopwatch.Stop();
                Console.WriteLine("Handle {0} times cost {1}, {2:f2} per sec.",
                                  except, stopwatch.Elapsed.TotalSeconds, except / stopwatch.Elapsed.TotalSeconds);

                Assert.AreEqual(list.Count, except);
            }
        }
예제 #3
0
 public void Dispose()
 {
     _redis.UnLock(_key);
 }