线程与并发系列一:Lock、Monitor、UserSpinLock
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的更多相关文章
- 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock
[源码下载] 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLoc ...
- 【转】多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上)
本篇从Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler的类关系图开始,希望通过 本篇的介绍能对常见的线程同步方法有一个整体的认识,而对 ...
- 【Java并发系列】----JUC之Lock
显式锁 Lock 在Java 5.0之前,协调共享对象的访问时可以使用的机制只有synchronized和volatile.Java 5.0后增加了一些新的机制,但并不是一种替代内置锁的方法,而是当内 ...
- Java并发编程系列-(2) 线程的并发工具类
2.线程的并发工具类 2.1 Fork-Join JDK 7中引入了fork-join框架,专门来解决计算密集型的任务.可以将一个大任务,拆分成若干个小任务,如下图所示: Fork-Join框架利用了 ...
- [转载] java并发编程:Lock(线程锁)
作者:海子 原文链接: http://www.cnblogs.com/dolphin0520/p/3923167.html 出处:http://www.cnblogs.com/dolphin0520/ ...
- java高并发系列 - 第6天:线程的基本操作
新建线程 新建线程很简单.只需要使用new关键字创建一个线程对象,然后调用它的start()启动线程即可. Thread thread1 = new Thread1(); t1.start(); 那么 ...
- java高并发系列 - 第31天:获取线程执行结果,这6种方法你都知道?
这是java高并发系列第31篇. 环境:jdk1.8. java高并发系列已经学了不少东西了,本篇文章,我们用前面学的知识来实现一个需求: 在一个线程中需要获取其他线程的执行结果,能想到几种方式?各有 ...
- java高并发系列 - 第11天:线程中断的几种方式
java高并发系列第11篇文章. 本文主要探讨一下中断线程的几种方式. 通过一个变量控制线程中断 代码: package com.itsoku.chat05; import java.util.con ...
- java高并发系列 - 第10天:线程安全和synchronized关键字
这是并发系列第10篇文章. 什么是线程安全? 当多个线程去访问同一个类(对象或方法)的时候,该类都能表现出正常的行为(与自己预想的结果一致),那我们就可以所这个类是线程安全的. 看一段代码: pack ...
随机推荐
- [linux] 更改目录显示颜色
第一.创建配置文件 $dircolors -p>~/.dircolors 第二.编辑配置文件 打开文件: $vi ~/.dircolors 找到这一行: DIR ; # directory #可 ...
- Ubuntu设置squid代理
1.安装squid sudo apt-get install squid 2,修改配置,增加需要使用代理的ip vi命令修改: vi /etc/squid/squid.conf 图形界面编辑 sudo ...
- 框架的 总结(nop)------添加功能
一.添加功能 1.首先需要在前端显示界面View视图中添加 <div class="pull-right"> <a href="@Url.Action( ...
- @Html.Partials 加载分布视图传参数
如何在视图中利用 viewData参数和model参数,示例如下 <body> <div style="background:#ffd800;width:200px;pad ...
- iOS圆形图片裁剪,以及原型图片外面加一个圆环
废话不多说,直接上代码 #import "ViewController.h" @interface ViewController () @property (nonatomic,s ...
- java动态代理模式
java动态代理机制详解 Spring的核心AOP的原理就是java的动态代理机制. 在java的动态代理机制中,有两个重要的类或接口: 1.InvocationHandler(Interface): ...
- whatweb
WhatWeb是一款网站指纹识别工具,主要针对的问题是:“这个网站使用的什么技术?”WhatWeb可以告诉你网站搭建使用的程序,包括何种CMS系统.什么博客系统.Javascript库.web服务器. ...
- SpringMVC中使用DWR
SpringMVC中使用DWR重点在其配置当中. 1. web.xml文件的配置 在DispatcherServlet中增加dwr的拦截来取代DwrServlet. 更改配置如下: <serv ...
- Poj-2250-Compromise
题意是找两篇文章中的最长子单词序列 能得出个数,但不知如何输出,找不到路径 看了别人的dfs,有所领悟: 若输入s1:ab,bd,fk,ce,ak,bt,cv s2: ab,fk,ce,tt,ak,b ...
- 女友要下岗?Windows 10的Cortana何方妖孽?
在Windows 10中,一大特色就是内置的Cortana小娜.她的出现为广大单身贵族带来了福音,就连天天秀恩爱的情侣也有了危机感. 小娜,你这样夺位这样真的好么? 还不帮我快快开始搜索 从Windo ...