线程安全和锁

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Test
{
class Demo2
{
//线程之间可以通过static变量来共享数据。
private static bool _isExecute = false;
static void Main()
{
new Thread(Execute).Start();//启动线程,执行方法Execute一次
new Thread(Execute).Start();//启动线程,再执行方法Execute一次
Console.ReadLine();
}

    static void Execute()
    {
        if (!_isExecute)
        {
            Console.WriteLine("Execute");
            _isExecute = true;//当变量变成true会执行一次或者两次
            
        }
    }

}
}
输出截图:
有时候是下面这样的:
在这里插入图片描述
有时候是这样的:
在这里插入图片描述
上面这种情况不会一直发生,因为第一个线程还没有来得及
把_isDone设置成true,第二个线程就进来了,而这不是我们
想要的结果,在多个线程下,结果不符合我们的需求,这就是线程不安全

下面是加上锁后的代码:

private static bool _isExecute = false;
private static object _lock = new object();创建锁
static void Main()
{
new Thread(Execute).Start();
new Thread(Execute).Start();
Console.ReadLine();
}

    static void Execute()
    {
        lock (_lock)上锁
        {
            if (!_isExecute)
            {
                Console.WriteLine("Execute"); // 
                _isExecute = true;
            }
        }
    }

在我们加上锁之后,被锁住的代码在同一个时间内只允许一个
线程访问,其它的线程会被阻塞,只有等到这个锁被释放之后
其它的线程才能执行被锁住的代码。
输出截图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值