lock锁的是内存地址
而.net有内部机制使得相同的字符串内存地址是相同的(new string)除外
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; namespace ConsoleApp { class Program { static void Main(string[] args) { List<string> keyList = new List<string> { "key1", "key2", "key1", "key1", "key1", "key1", }; keyList.ForEach(u => { ThreadPool.QueueUserWorkItem(s => { Test.lockTestByString(u); }); }); Console.Read(); } } public class Test { public static void lockTestByString(string key) { lock (key) { GCHandle handle = GCHandle.Alloc(key, GCHandleType.Pinned); //获取内存地址 IntPtr address = handle.AddrOfPinnedObject(); Console.WriteLine("上锁2s key=" + key + " 内存地址:" + address); Thread.Sleep(2000); Console.WriteLine("解锁"); } } } }
运行效果图:
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; namespace ConsoleApp { //class Program //{ // static void Main(string[] args) // { // List<string> keyList = new List<string> { "key1", "key2", "key1", "key1", "key1", "key1", }; // keyList.ForEach(u => // { // ThreadPool.QueueUserWorkItem(s => // { // Test.lockTestByString(u); // }); // }); // Console.Read(); // } //} public class Test { public static void lockTestByString(string key) { lock (key) { GCHandle handle = GCHandle.Alloc(key, GCHandleType.Pinned); //获取内存地址 IntPtr address = handle.AddrOfPinnedObject(); Console.WriteLine("上锁2s key=" + key + " 内存地址:" + address); Thread.Sleep(2000); Console.WriteLine("解锁"); } } } class Program { static void Main(string[] args) { List<string> keyList = new List<string> { new string('k', 1), new string('k', 1), new string('k', 1), new string('k', 1) }; keyList.ForEach(u => { ThreadPool.QueueUserWorkItem(s => { Test.lockTestByString(u); }); }); Console.Read(); } } }
运行效果图: