C#多线程编程中的锁系统基本用法
平常在多线程开发中,总避免不了线程同步。本篇就对net多线程中的锁系统做个简单描述。
目录
一:lock、Monitor
1:基础。
2: 作用域。
3:字符串锁。
4:monitor使用
二:mutex
三:Semaphore
四:总结
一:lock、Monitor
1:基础
Lock是Monitor语法糖简化写法。Lock在IL会生成Monitor。
//======Example 1=====
string obj = "helloworld";
lock (obj)
{
Console.WriteLine(obj);
}
//lock IL会编译成如下写法
bool isGetLock = false;
Monitor.Enter(obj, ref isGetLock);
try
{
Console.WriteLine(obj);
}
finally
{
if (isGetLock)
{
Monitor.Exit(obj);
}
}
isGetLock参数是Framework 4.0后新加的。 为了使程序在所有情况下都能够确定,是否有必要释放锁。例: Monitor.Enter拿不到锁
Monitor.Enter 是可以锁值类型的。锁时会装箱成新对象,所以无法做到线程同步。
2:作用域
一:Lock是只能在进程内锁,不能跨进程。走的是混合构造,先自旋再转成内核构造。
二:关于对type类型的锁。如下:
//======Example 2=====
new Thread(new ThreadStart(() => {
lock (typeof(int))
{
Thread.Sleep(10000);
Console.WriteLine("Thread1释放");
}
})).Start();
Thread.Sleep(1000);
lock(typeof(int))
{
Console.WriteLine("Thread2释放");
}
运行结果如下:
我们在来看个例子。
//======Example 3=====
Console.WriteLine(DateTime.Now);
AppDomain appDomain1 = AppDomain.CreateDomain("AppDomain1");
LockTest Worker1 = (LockTest)appDomain1.CreateInstanceAndUnwrap(
Assembly.GetExecutingAssembly().FullName,
"ConsoleApplication1.LockTest");
Worker1.Run();
AppDomain appDomain2 = AppDomain.CreateDomain("AppDomain2");
LockTest Worker2 = (LockTest)appDomain2.CreateInstanceAndUnwrap(
Assembly.GetExecutingAssembly().FullName,
"ConsoleApplication1.LockTest");
Worker2.Run();
/// <summary>
/// 跨应用程序域边界或远程访问时需要继承MarshalByRefObject
/// </summary>
public class LockTest : MarshalByRefObject
{
public void Run()
{
lock (typeof(int))
{
Thread.Sleep(10000);
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName + ": Thread 释放," + DateTime.Now);
}
}
}
以上是 C#多线程编程中的锁系统基本用法 的全部内容, 来源链接: utcz.com/z/330396.html