lock为线程锁,确保同一个时刻只有一个线程访问资源;
摘要:
lock为互斥锁,在一个类里面声明一个私有静态object类型,不可为值类型,要为引用类型;
lock(object)
{
//锁住片段
}
正确使用方式:
第一步:新建一个windows窗体应用项目;
第二步:创建一个类
public class Class1
{
/// <summary>
/// 用作互斥锁对象
/// </summary>
private static object isruning = new object();
/// <summary>
/// 第一个访问资源函数
/// </summary>
public void Test()
{
lock (isruning)
{
MessageBox.Show("第一个访问资源");
Thread.Sleep(5000);
}
}
/// <summary>
/// 第二个访问资源函数
/// </summary>
public void Test1()
{
lock (isruning)
{
MessageBox.Show("第二个访问资源");
Thread.Sleep(5000);
}
}
}
说明: private static object isruning = new object();为何要声明为静态类型,因为如果不声明为静态类型,当我们实例化多个时,就会有实例化出多个object变量,俩个实例化的对象就不存在互斥锁了。
第三步:在窗体上添加俩个按钮Name属性分别为btnTest和btnTest1,并注册俩个按钮的点击事件。
添加如下代码:
/// <summary>
/// 实例化一个Class1对象
/// </summary>
public Class1 TestClass1 = new Class1();
/// <summary>
/// 再次实例化一个Class1对象
/// </summary>
public Class1 TestClass2 = new Class1();
/// <summary>
/// 按钮1点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnTest_Click(object sender, EventArgs e)
{
//新建一个线程,并执行
Thread thread = new Thread(TestClass1.Test);
thread.IsBackground = true;
thread.Start();
}
/// <summary>
/// 按钮2点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnTest1_Click(object sender, EventArgs e)
{
//新建一个线程并执行
Thread thread = new Thread(TestClass2.Test1);
thread.IsBackground = true;
thread.Start();
}
说明:
点击按钮1,弹出对话框第一个访问资源,点击确定,马上点击按钮2。等待一段时间后将弹出对话框第二个访问资源。这是因为当点击按钮1,执行Test,当执行到lock关键字时,查看isruning是否被互斥。有就等待到释放互斥锁再执行锁住片段,没有弹出第一个访问资源,并停止5秒。。马上点击了第二个按钮,执行Test1,当执行到lock关键字时,查看isruning是否正锁住,有就等待到释放互斥锁再执行锁住片段,没有弹出第二个访问资源,并停止5秒。