using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ThreadLockMutexMonitor
{
class Program
{
static void Main(string[] args)
{
LockStartThread();
//MutexStartThread();
//MonitorStartThread();
}
#region startThread
static void LockStartThread()
{
Thread lockThread1 = new Thread(LockThreadFunc1);
Thread lockThread2 = new Thread(LockThreadFunc2);
lockThread1.Start();
lockThread2.Start();
}
static void MutexStartThread()
{
Thread thread1 = new Thread(MutexF1);
Thread thread2 = new Thread(MutexF2);
thread1.Start();
thread2.Start();
}
static void MonitorStartThread()
{
Thread thread1 = new Thread(MonitorF1);
Thread thread2 = new Thread(MonitorF2);
thread1.Start();
thread2.Start();
}
#endregion
static object obj = new object();
#region LockTest
static void LockThreadFunc1()
{
lock (obj)
{
for (int i = 0; i < 10; i++)
{
lock (obj)
{
Func("LockThreadFunc1");
}
}
}
}
static void LockThreadFunc2()
{
lock (obj)
{
for (int i = 0; i < 10; i++)
{
lock (obj)
{
Func("LockThreadFunc2");
}
}
}
}
#endregion
#region MutexTest
static Mutex m = new Mutex();
static void MutexF1()
{
m.WaitOne();
for (int i = 0; i < 10; i++)
{
m.WaitOne();
Func("MutexF1");
m.ReleaseMutex();
}
m.ReleaseMutex();
}
static void MutexF2()
{
m.WaitOne();
for (int i = 0; i < 10; i++)
{
m.WaitOne();
Func("MutexF2");
m.ReleaseMutex();
}
m.ReleaseMutex();
}
#endregion
#region MonitorTest
static void MonitorF1()
{
Monitor.Enter(obj);
for (int i = 0; i < 10; i++)
{
Monitor.Enter(obj);
Func("MonitorF1");
Monitor.Exit(obj);
}
Monitor.Exit(obj);
}
static void MonitorF2()
{
Monitor.Enter(obj);
for (int i = 0; i < 10; i++)
{
Monitor.Enter(obj);
Func("MonitorF2");
Monitor.Exit(obj);
}
Monitor.Exit(obj);
}
#endregion
/// <summary>
/// 测试方法
/// </summary>
/// <param name="str"></param>
static void Func(string str)
{
Console.WriteLine("{0},{1}", str, DateTime.Now.Millisecond.ToString());
Thread.Sleep(500);
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ThreadLockMutexMonitor
{
class Program
{
static void Main(string[] args)
{
LockStartThread();
//MutexStartThread();
//MonitorStartThread();
}
#region startThread
static void LockStartThread()
{
Thread lockThread1 = new Thread(LockThreadFunc1);
Thread lockThread2 = new Thread(LockThreadFunc2);
lockThread1.Start();
lockThread2.Start();
}
static void MutexStartThread()
{
Thread thread1 = new Thread(MutexF1);
Thread thread2 = new Thread(MutexF2);
thread1.Start();
thread2.Start();
}
static void MonitorStartThread()
{
Thread thread1 = new Thread(MonitorF1);
Thread thread2 = new Thread(MonitorF2);
thread1.Start();
thread2.Start();
}
#endregion
static object obj = new object();
#region LockTest
static void LockThreadFunc1()
{
lock (obj)
{
for (int i = 0; i < 10; i++)
{
lock (obj)
{
Func("LockThreadFunc1");
}
}
}
}
static void LockThreadFunc2()
{
lock (obj)
{
for (int i = 0; i < 10; i++)
{
lock (obj)
{
Func("LockThreadFunc2");
}
}
}
}
#endregion
#region MutexTest
static Mutex m = new Mutex();
static void MutexF1()
{
m.WaitOne();
for (int i = 0; i < 10; i++)
{
m.WaitOne();
Func("MutexF1");
m.ReleaseMutex();
}
m.ReleaseMutex();
}
static void MutexF2()
{
m.WaitOne();
for (int i = 0; i < 10; i++)
{
m.WaitOne();
Func("MutexF2");
m.ReleaseMutex();
}
m.ReleaseMutex();
}
#endregion
#region MonitorTest
static void MonitorF1()
{
Monitor.Enter(obj);
for (int i = 0; i < 10; i++)
{
Monitor.Enter(obj);
Func("MonitorF1");
Monitor.Exit(obj);
}
Monitor.Exit(obj);
}
static void MonitorF2()
{
Monitor.Enter(obj);
for (int i = 0; i < 10; i++)
{
Monitor.Enter(obj);
Func("MonitorF2");
Monitor.Exit(obj);
}
Monitor.Exit(obj);
}
#endregion
/// <summary>
/// 测试方法
/// </summary>
/// <param name="str"></param>
static void Func(string str)
{
Console.WriteLine("{0},{1}", str, DateTime.Now.Millisecond.ToString());
Thread.Sleep(500);
}
}
}