using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading; namespace MyConsole.ThreadDemo
{
class Lock
{
static int Storeage { get; set; }
static object LockObject = new object(); static void Main(string[] args)
{
var timer = new Stopwatch();
var my = new Lock();
var data = new Dictionary<string, Action>()
{
{"错误的代码",my.Wrong},
{"正解的代码 使用Lock",my.UserLock},
{"正解的代码 使用Monitor",my.UserMonitor},
{"使用UserSpinLock",my.UserSpinLock},
};
foreach (var item in data)
{
Console.WriteLine();
Console.WriteLine(item.Key);
timer.Restart();
my.Being(new ThreadStart(item.Value));
timer.Stop();
Console.WriteLine(timer.ElapsedTicks);
}
} #region = Wrong =
void Wrong()
{
var random = new Random(DateTime.Now.Millisecond);
var w = random.Next();
Lock.Storeage = w;
Thread.Sleep(random.Next(, ));
var r = Lock.Storeage; Message(w, r);
}
#endregion #region = UserLock =
void UserLock()
{
var random = new Random(DateTime.Now.Millisecond);
var w = random.Next();
var r = -;
lock (LockObject)
{
Lock.Storeage = w;
Thread.Sleep(random.Next(, ));
r = Lock.Storeage;
} Message(w, r);
}
#endregion #region = UserMonitor =
void UserMonitor()
{
var random = new Random(DateTime.Now.Millisecond);
var w = random.Next();
var r = -;
Monitor.Enter(LockObject); Lock.Storeage = w;
Thread.Sleep(random.Next(, ));
r = Lock.Storeage;
Monitor.Exit(LockObject); Message(w, r);
}
#endregion #region = UserSpinLock =
SpinLock _spinlock = new SpinLock();
void UserSpinLock()
{
var random = new Random(DateTime.Now.Millisecond);
var w = random.Next();
var r = -;
var lockTaken = false;
_spinlock.Enter(ref lockTaken); Lock.Storeage = w;
Thread.Sleep(random.Next(, ));
r = Lock.Storeage;
_spinlock.Exit(); Message(w, r);
}
#endregion #region = Being =
void Being(ThreadStart start)
{
var threads = Enumerable.Range(, ).Select(x => new Thread(start)).ToList();//必须ToList一下
foreach (var item in threads)
{
item.Start();
} foreach (var item in threads)
{
item.Join();
}
}
#endregion #region - Message -
static void Message(int w, int r)
{
var msg = string.Format("线程{0}在运行 存入{1} 读出{2} {3}",
Thread.CurrentThread.ManagedThreadId, r, w,
r == w ? "正确" : "错误");
Console.WriteLine(msg);
}
#endregion
}
}

输出

错误的代码
线程5在运行 存入99 读出95 错误
线程4在运行 存入99 读出95 错误
线程6在运行 存入99 读出47 错误
线程3在运行 存入99 读出43 错误
线程8在运行 存入99 读出47 错误
线程7在运行 存入99 读出47 错误
线程9在运行 存入99 读出47 错误
线程10在运行 存入99 读出47 错误
线程12在运行 存入99 读出99 正确
线程11在运行 存入99 读出99 正确 正解的代码 使用Lock
线程13在运行 存入8 读出8 正确
线程14在运行 存入61 读出61 正确
线程16在运行 存入61 读出61 正确
线程15在运行 存入61 读出61 正确
线程18在运行 存入65 读出65 正确
线程17在运行 存入13 读出13 正确
线程20在运行 存入17 读出17 正确
线程19在运行 存入65 读出65 正确
线程22在运行 存入22 读出22 正确
线程21在运行 存入70 读出70 正确 正解的代码 使用Monitor
线程23在运行 存入90 读出90 正确
线程25在运行 存入90 读出90 正确
线程24在运行 存入90 读出90 正确
线程27在运行 存入95 读出95 正确
线程26在运行 存入95 读出95 正确
线程29在运行 存入56 读出56 正确
线程31在运行 存入65 读出65 正确
线程28在运行 存入52 读出52 正确
线程30在运行 存入61 读出61 正确
线程32在运行 存入70 读出70 正确 使用UserSpinLock
线程33在运行 存入19 读出19 正确
线程40在运行 存入24 读出24 正确
线程41在运行 存入76 读出76 正确
线程35在运行 存入71 读出71 正确
线程34在运行 存入19 读出19 正确
线程38在运行 存入24 读出24 正确
线程39在运行 存入24 读出24 正确
线程36在运行 存入71 读出71 正确
线程37在运行 存入24 读出24 正确
线程42在运行 存入76 读出76 正确

最新文章

  1. 在Web Api中集成protobuf
  2. android如何实现文件按时间先后顺序排列显示
  3. php函数研究
  4. 《SQL Server企业级平台管理实践》读书笔记——SQL Server中收缩数据库不好用的原因
  5. noip2011提高组day1+day2解题报告
  6. 在Python中,令values=[0,1,2];values[1]=values,为何结果是[0,[...],2]?
  7. HDU5765 Bonds 最小割极
  8. minicom 配置
  9. 关于IOCP,某些地方就是不让人彻底舒服(WSASend重叠post数据)
  10. ResolveUrl in ASP.NET - The Perfect Solution
  11. JS——基础知识
  12. jenkins 集成钉钉机器人
  13. Unity3d_GUI_2__(能量条的学习)
  14. JS中将json字符串转为json对象的三种方式
  15. JVM工具jstat使用说明
  16. cocos creator
  17. 第二篇:SpringBoot2.0整合ActiveMQ
  18. [转载]DropDownList三级菜单联动源码
  19. 点击搜索条件提交form表单
  20. 深入理解MapReduce的架构及原理

热门文章

  1. coreseek实战(二):windows下mysql数据源部分配置说明
  2. iOS(OC)中的冒泡排序
  3. su - root 报su: incorrect password的错误
  4. SpringMVC+MyBatis项目分析与开发实例
  5. 【Java】XML解析之JDOM
  6. 基于ticket的rw锁
  7. QQ摄像头读取条码
  8. elixir 高可用系列(二) GenServer
  9. Java中利用MessageFormat对象实现类似C# string.Format方法格式化
  10. [OpenGL] 2、企业版VC6.0自带的Win32-OpenGL工程浅析