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 正确

线程与并发系列一:Lock、Monitor、UserSpinLock的更多相关文章

  1. 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock

    [源码下载] 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLoc ...

  2. 【转】多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上)

    本篇从Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler的类关系图开始,希望通过 本篇的介绍能对常见的线程同步方法有一个整体的认识,而对 ...

  3. 【Java并发系列】----JUC之Lock

    显式锁 Lock 在Java 5.0之前,协调共享对象的访问时可以使用的机制只有synchronized和volatile.Java 5.0后增加了一些新的机制,但并不是一种替代内置锁的方法,而是当内 ...

  4. Java并发编程系列-(2) 线程的并发工具类

    2.线程的并发工具类 2.1 Fork-Join JDK 7中引入了fork-join框架,专门来解决计算密集型的任务.可以将一个大任务,拆分成若干个小任务,如下图所示: Fork-Join框架利用了 ...

  5. [转载] java并发编程:Lock(线程锁)

    作者:海子 原文链接: http://www.cnblogs.com/dolphin0520/p/3923167.html 出处:http://www.cnblogs.com/dolphin0520/ ...

  6. java高并发系列 - 第6天:线程的基本操作

    新建线程 新建线程很简单.只需要使用new关键字创建一个线程对象,然后调用它的start()启动线程即可. Thread thread1 = new Thread1(); t1.start(); 那么 ...

  7. java高并发系列 - 第31天:获取线程执行结果,这6种方法你都知道?

    这是java高并发系列第31篇. 环境:jdk1.8. java高并发系列已经学了不少东西了,本篇文章,我们用前面学的知识来实现一个需求: 在一个线程中需要获取其他线程的执行结果,能想到几种方式?各有 ...

  8. java高并发系列 - 第11天:线程中断的几种方式

    java高并发系列第11篇文章. 本文主要探讨一下中断线程的几种方式. 通过一个变量控制线程中断 代码: package com.itsoku.chat05; import java.util.con ...

  9. java高并发系列 - 第10天:线程安全和synchronized关键字

    这是并发系列第10篇文章. 什么是线程安全? 当多个线程去访问同一个类(对象或方法)的时候,该类都能表现出正常的行为(与自己预想的结果一致),那我们就可以所这个类是线程安全的. 看一段代码: pack ...

随机推荐

  1. HttpServletrequest 与HttpServletResponse总结

    如果说DOM是javascript与HTML的桥梁,那么servlet就是前端与后端的桥梁,HttpServletRequest和HttpServletResponse就是之间的信使,好了,废话不多说 ...

  2. 使用servers 启动项目时 ,一直处于启动中, 最后出现无法的问题。

    使用eclipse 中的servers 配置了一个server 来启动项目, 发现无法启动 排除法: 去掉项目配置,单独启动该server ,发现可以启动, 说明是项目出现问题 但是项目并没有报错, ...

  3. windows2003 iis+dedecms 4.0701版本,登录后台显示空白

    又可能是,i_user对 system32没有权限导致

  4. homework 11 2016 5 13 读入文件做输入

    #include <iostream>#include <fstream> using namespace std; int main(){ string x, y, z; c ...

  5. eclips android项目复制

    1.将要复制的项目从workspace里面copy到另外一个目录 2.将这个项目重命名 3.使用android tool 里的包名修改工具(rename appliction package),修改报 ...

  6. 字符串和json之间的互相转化

    在Firefox,chrome,opera,safari,ie9,ie8等高级浏览器直接可以用JSON对象的stringify()和parse()方法. JSON.stringify(obj)将JSO ...

  7. linux httpd 服务的安装

    1.查看是否安装了httpd rpm -qa|grep httpd 2.安装httpd 使用yum 安装 yum -y install httpd 3.关闭防火墙和selinxu 4.使用fz软件或者 ...

  8. Android:res之layer-list的用法

    layer-list可以将多个图片按照顺序层叠起来,让其看起来像一个图一样.  和    叠加为: 用法: 在在drawable下建立一个xml文件,faceleft.xml <?xml ver ...

  9. p7 struct and union

    struct  StudentRec           //①声明结构体类型StudentRec{        char StuNum[20];        //②定义结构体的成员变量      ...

  10. Fiddler:在PC和移动设备上抓取HTTPS数据包

    Fiddler是一个免费的Web调试代理,支持任何浏览器.系统以及平台.这个工具是进行Web和App网络开发的必备工具,戳此处下载. 根据Fiddler官网的描述,具有以下六大特点: Web调试 性能 ...