C#加锁的例程

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace LockTest
{
class Program
{
static void Main(string[] args)
{
TestLock testlock = new TestLock();
Thread th = new Thread(() =>
{
//模拟死锁:造成死锁,使lock无法释放,在i=5时,跳出死循环,释放lock
testlock.DoWorkWithLock();
});
th.Start();
Thread.Sleep(1000);
Thread th2 = new Thread(() =>
{
//这个地方你可能会有疑惑,但存在这种情况,比如你封装的dll,对其它开发人员不是可见的
//开发人员很有可能在他的逻辑中,加上一个lock保证方法同时被一个线程调用,但这时有其它的线程正在调用该方法,
//但并没有释放,死锁了,那么在这里就不会被执行,除非上面的线程释放了lock锁定的对象。这里的lock也可以理解为一个标识,线程1被锁定的对象
//是否已经被释放,
//如果没有释放,则无法继续访问lock块中的代码。
lock (testlock)
{
// 如果该对象中lock(this)不释放(testlock与this指的是同一个对象),则其它线程如果调用该方法,则会出现直到lock(this)释放后才能继续调用。
testlock.MotherCallYouDinner();
testlock.DoWorkWithLock();
}
});
th2.Start();
Console.Read();
}
}

class TestLock
{
    public static readonly object objLock = new object();
    /// 
    ///  该方法,希望某人在工作的时候,其它人不要打扰(希望只有一个线程在执行)
    /// 
    /// 
    public void DoWorkWithLock()
    {
        //锁当前对象
        lock (this)
        {
            Console.WriteLine("lock this");
            int i = 0;
            while (true)
            {
                Console.WriteLine("At work, do not disturb...,Thread id is " + Thread.CurrentThread.ManagedThreadId.ToString());
                Thread.Sleep(1000);
                if (i == 5)
                {
                    break;
                }
                Console.WriteLine(i.ToString());
                i++;
            }
        }
        Console.WriteLine("lock dispose");
    }
    public void MotherCallYouDinner()
    {
        Console.WriteLine("Your mother call you to home for dinner.");
    }
}
}

你可能感兴趣的:(c#)