1.Monitor.Enter()、Monitor.Exit()
概要:Thread1和Thread2在加锁前
,对共同的方法,是谁抢到资源谁就执行——加锁后
,必须是一个线程执行完毕,另一个线程才会执行。
加锁前:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace zhengque
{
class Program
{
private static object lockObj = new object();
private static void Execute()
{
//Monitor.Enter(lockObj);
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Thread Name:" + Thread.CurrentThread.Name + ", Count:" + i);
Thread.Sleep(new Random().Next(1000));
}
//Monitor.Exit(lockObj);
}
static void Main(string[] args)
{
Thread thread1 = new Thread(new ThreadStart(Execute));
thread1.Name = "Thread1";
thread1.Start();
Thread thread2 = new Thread(new ThreadStart(Execute));
thread2.Name = "Thread2";
thread2.Start();
//thread1.Join();
//thread2.Join();
Console.ReadLine();
}
}
}
加锁后:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace zhengque
{
class Program
{
private static object lockObj = new object();
private static void Execute()
{
Monitor.Enter(lockObj);
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Thread Name:" + Thread.CurrentThread.Name + ", Count:" + i);
Thread.Sleep(new Random().Next(1000));
}
Monitor.Exit(lockObj);
}
static void Main(string[] args)
{
Thread thread1 = new Thread(new ThreadStart(Execute));
thread1.Name = "Thread1";
thread1.Start();
Thread thread2 = new Thread(new ThreadStart(Execute));
thread2.Name = "Thread2";
thread2.Start();
//thread1.Join();
//thread2.Join();
Console.ReadLine();
}
}
}
2.Monitor.Wait() 、Monitor.Pulse()
之前很是纠结,直到看了下面这篇博客:
锁之锁的三种状态及Monitor.Wait, Monitor.Pulse,Monitor.PulseAll的作用与用法