C#关于使用lock关键字,线程锁

2023-04-08 14:06:12

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秒。

  • 作者:MyNightSunshine
  • 原文链接:https://blog.csdn.net/MyNightSunshine/article/details/97617463
    更新时间:2023-04-08 14:06:12