1.概述
线程锁
英文名称 | 中文名称 | 概述 | |
lock | 锁 | 常用 | |
InterLocked | 自由锁 | 简单而特殊的情况 | |
Monitor | 监控 | Enter~Exit(lock堆) | |
SpinLock | 自旋锁 | Enter~Exit(lock栈) | |
Mutex | 互斥 | 名称 进程 | 这个的特点是继承与WaitHandle |
Semphore | 信号量 | 锁的对象是多个,其他的都是一个 |
2.实验
2.1 代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApplication3
{
class Program
{
int a = 0;
static void Main(string[] args)
{
Console.WriteLine("ddd");
Program p = new Program();
//p.main();
p.main2();
Console.Read();
}
private void main() {
for (int i = 0; i < 5; i++) {
new Thread(fun3) {Name="name"+i}.Start();
}
Thread.Sleep(5000);
Console.WriteLine("a:" + a);
}
void fun()
{
Console.WriteLine("Thread.CurrentThread.Name" + Thread.CurrentThread.Name);
lock(this){
a++;
Console.WriteLine("a+:" + a);
}
//nutex.ReleaseMutex();
try
{
Thread.Sleep(500);
}
catch(Exception e) {
}
}
void fun2()
{
Console.WriteLine("Thread.CurrentThread.Name" + Thread.CurrentThread.Name);
Monitor.Enter(this);
a++;
Monitor.Exit(this);
//nutex.ReleaseMutex();
try
{
Thread.Sleep(500);
}
catch (Exception e)
{
}
}
void fun3()
{
Console.WriteLine("Thread.CurrentThread.Name" + Thread.CurrentThread.Name);
Mutex mutex = new Mutex();
if (mutex.WaitOne()) {
a++;
mutex.ReleaseMutex();
}
try
{
Thread.Sleep(500);
}
catch (Exception e)
{
}
}
void funLock() {
Console.WriteLine("Thread.CurrentThread.Name" + Thread.CurrentThread.Name);
lock (this)
{
a++;
Console.WriteLine("a+:" + a);
}
//nutex.ReleaseMutex();
try
{
Thread.Sleep(500);
}
catch (Exception e)
{
}
}
void main2() {
Delegatefun[] deArray = { runLok, runInterLock, runMonitor, runMutex };
String[] typeArray = { "runLok", "runInterLock", "runMonitor", "runMutex" };
finishShow(runLok, "runLok");
for (int i = 0; i < 4; i++) {
finishShow(deArray[i], typeArray[i]);
Thread.Sleep(7000);
}
}
void finishShow(Delegatefun fun, String typeName)
{
for (int i = 0; i < 5; i++)
{
//new Thread(yanshi) { Name = "name_" + typeName + "_" + i }.Start(5);
Thread t = new Thread(chanshuT);
t.Name = "name_" + typeName + "_" + i;
t.Start(fun);
}
Thread.Sleep(6000);
Console.WriteLine(typeName+" a:" + a);
}
void chanshuT(Object a) {
Delegatefun fun = (Delegatefun)a;
runMain(fun);
}
void yanshi()
{
try
{
Thread.Sleep(500);
}
catch (Exception e)
{
}
}
void run() {
a++;
}
void runLok() {
lock (this) {
run();
}
}
void runInterLock() {
Interlocked.Increment(ref a);
}
void runMonitor()
{
Monitor.Enter(this);
try{
run();
}
finally {
Monitor.Exit(this);
}
}
void runMutex()
{
bool createdNew;
Mutex mutex = new Mutex(false, "nutextName", out createdNew);
if (mutex.WaitOne())
{
try
{
run();
}
finally
{
mutex.ReleaseMutex();
}
}
else {
Console.WriteLine("等待中");
}
}
void runMain(Delegatefun runLockX)
{
Console.WriteLine(Thread.CurrentThread.Name + "a+前:" + a);
runLockX();
Console.WriteLine(Thread.CurrentThread.Name + "a+后:" + a);
yanshi();
}
}
delegate void Delegatefun();
}
2.2 结果
2.2.1 mian() 的结果
2.2.2 mian2() 的结果