using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace MultipleTread { class Program { static void Main(string[] args) { Thread thread1 = new Thread(new ParameterizedThreadStart(test)); Thread thread2 = new Thread(new ParameterizedThreadStart(test)); thread1.Start("lliu"); thread2.Start("qi"); Console.ReadKey(); } public static void test(object UserName) { NedisClient client1 = NedisClient.Connect(new Person() { UserName= UserName.ToString(), PassWord="liu"}); Console.WriteLine(client1.UserName); Thread.Sleep(1000); Console.WriteLine(client1.UserName); //NedisClient client2 = NedisClient.Connect(new Person() { UserName = UserName.ToString(), PassWord = "qi" }); //Console.WriteLine(client1.UserName); //Console.WriteLine(client1 == client2); //Console.WriteLine(client1.UserName + " => " + client2.UserName); //client1.ForceRedisFailover(); } } class NedisClient: IDisposable { public string UserName { get; set; } public string PassWord { get; set; } public static NedisClient Connect(Person configuration) { return ConnectImpl(() => CreateMultiplexer(configuration)); } private static NedisClient CreateMultiplexer(Person configuration) { return new NedisClient(configuration); } private NedisClient(Person configuration) { this.UserName = configuration.UserName; this.PassWord = configuration.PassWord; } private static NedisClient ConnectImpl(Func<NedisClient> multiplexerFactory) { IDisposable killMe = null; try { var muxer = multiplexerFactory(); killMe = muxer; killMe = null; return muxer; } finally { if (killMe != null) try { killMe.Dispose(); } catch { } } } /// <summary> /// 故障转移操作锁 加static和不加static有质的区别 /// </summary> private static readonly object forceFailoverLocker = new object(); /// <summary> /// 强制进行故障转移 /// </summary> /// <param name="masterName"></param> public void ForceRedisFailover() { // 同时只进行一个强制故障转移 lock (forceFailoverLocker) { Console.WriteLine("b"); Thread.Sleep(1000); Console.WriteLine("e"); } } public void Dispose() { throw new NotImplementedException(); } } public class Person { public string UserName { get; set; } public string PassWord { get; set; } } }