线程同步之LOCK锁
在Framework中已经为我们提供了三个加锁的机制,分别是
Monitor类
Lock关键字
Mutex类
Monitor类
Lock关键字
Mutex类
都是锁定数据或是锁定被调用的函数。
Mutex则多用于锁定多线程间的同步调用。简单的说,Monitor和Lock多用于锁定被调用端,而Mutex则多用锁定调用端。
Monitor和Lock将代码段标记为临界区,其实现原理是首先锁定某一私有对象,然后执行代码段中的语句,当代码段中的语句执行完毕后,再解除锁。
Mutex则多用于锁定多线程间的同步调用。简单的说,Monitor和Lock多用于锁定被调用端,而Mutex则多用锁定调用端。
Monitor和Lock将代码段标记为临界区,其实现原理是首先锁定某一私有对象,然后执行代码段中的语句,当代码段中的语句执行完毕后,再解除锁。
-----------------LOCK结构
private Object obj = new Object();//定义一私有对象
//……其它代码
lock(this)
{
//……操作临界资源
}
例如:
lock(this)
{
Console.WriteLine("{0}{1}", str, System.DateTime.Now.Millisecond.ToString());
Thread.Sleep(50);
}
----------------lock举例(控制台程序)
下面程序中有两个线程thread1、thread2和一个TestFunc函数,TestFunc会打印出调用它的线程名和调用的时间(mm级的),两个线程分别以30mm和100mm来调用TestFunc这个函数。TestFunc执行的时间为50mm。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace 线程同步
{
class Program
{
#region 变量区
Thread thread1 = null;
Thread thread2 = null;
Mutex metux = null;
#endregion
static void Main(string[] args)
{
Program p = new Program();
p.RunThread();
Thread.Sleep(10000);
p.CloseThread();
}
///---
public Program()
{
metux = new Mutex();
thread1 = new Thread(thread1Func);
thread2 = new Thread(thread2Func);
}
/// <summary>
/// ---启动线程
/// </summary>
public void RunThread()
{
thread1.Start();
thread2.Start();
}
/// <summary>
/// ---线程1
/// </summary>
private void thread1Func()
{
for (int i = 0; i < 10; i++)
{
TestFunc("thread1 had run " + i.ToString() + "times ");
Thread.Sleep(30);
}
}
/// <summary>
/// ---线程2
/// </summary>
private void thread2Func()
{
for (int i = 0; i < 10; i++)
{
TestFunc("thread2 had run " + i.ToString() + "times ");
Thread.Sleep(100);
}
}
/// <summary>
/// ---调用函数
/// </summary>
/// <param name="str"></param>
private void TestFunc(string str)
{
lock(this)
{
Console.WriteLine("{0}{1}", str, System.DateTime.Now.Millisecond.ToString());
Thread.Sleep(50);
}
}
/// <summary>
/// ---杀死线程
/// </summary>
private void CloseThread()
{
if (thread1.IsAlive)
{
thread1.Abort();
}
if (thread2.IsAlive)
{
thread2.Abort();
}
}
}
}
输出结果(不同计算机上,结果可能不同):