class Program
{
static void Main(string[] args)
{

//在t1线程中调用LockMe,并将deadlock设为true(将出现死锁)
int i = 10;
while (i > 0)
{
 
Thread t1 = new Thread(LockMe);
t1.Start(true);
Thread.Sleep(1000);
 
Console.WriteLine(string.Format("1.i:{0},开始调用LockMe :{1}",i, System.DateTime.Now));
i = i - 1;
}
 
Console.ReadLine();
}
public static object locker = new object();
public static void LockMe(object o)
{

lock (locker)
{
 Console.WriteLine(string.Format("2. 我是锁定的 :{0}", System.DateTime.Now));
Thread.Sleep(2000);
 
}
}
}

一定要把 锁的对象 public static object locker = new object(); 写在方法外边,

如果按照下面的写法则不起作用
public static void LockMe(object o)
{
 object locker = new object();
lock (locker)
{
 Console.WriteLine(string.Format("2. 我是锁定的 :{0}", System.DateTime.Now));
Thread.Sleep(2000);
 
}
}

============================================

class Program
{
static void Main(string[] args)
{
C1 c1 = new C1();
//在t1线程中调用LockMe,并将deadlock设为true(将出现死锁)
int i = 10;
while (i > 0)
{
Thread t1 = new Thread(c1.LockMe);
 
t1.Start(true);
Thread.Sleep(1000);
 
Console.WriteLine(string.Format("1.i:{0},开始调用LockMe :{1}",i, System.DateTime.Now));
i = i - 1;
}
//在主线程中lock c1
//lock (c1)
//{
// //调用没有被lock的方法
// c1.DoNotLockMe();
// //调用被lock的方法,并试图将deadlock解除
// c1.LockMe(true);
//}
Console.ReadLine();
}
 
}
}

class C1
{
//private bool deadlocked = true;
//private object locker = new object();
////这个方法用到了lock,我们希望lock的代码在同一时刻只能由一个线程访问
//public void LockMe(object o)
//{
// lock (this)
// {
// while (deadlocked)
// {
// deadlocked = (bool)o;
// Console.WriteLine("Foo: 我是锁定的 :(");
// Thread.Sleep(500);
// }
// }
//}
private bool deadlocked = true;
private object locker = new object();
//这个方法用到了lock,我们希望lock的代码在同一时刻只能由一个线程访问
public void LockMe(object o)
{
lock (locker)
{
//while (deadlocked)
//{
//deadlocked = (bool)o;
Console.WriteLine(string.Format("2. 我是锁定的 :{0}",System.DateTime.Now));
Thread.Sleep(2000);
//}
}
}
//所有线程都可以同时访问的方法
public void DoNotLockMe()
{
Console.WriteLine("我是未被锁定 :)");
}
}

C# 多线程 lock 实例的更多相关文章

  1. (转) C#多线程赛跑实例

    专于:http://blog.csdn.net/lidatgb/article/details/8363035 结合上篇<多线程的基础>,这次我们写一个多线程的赛跑实例,内容很简单:超人和 ...

  2. vc 基于对话框多线程编程实例——线程之间的通信

     vc基于对话框多线程编程实例——线程之间的通信 实例:

  3. C#多线程编程实例 螺纹与窗口交互

    C#多线程编程实例 螺纹与窗口交互 代码: public partial class Form1 : Form { //声明线程数组 Thread[] workThreads = new Thread ...

  4. c# 多线程 创建对象实例

    本次的标题是我在写单例模式的博客时遇到的问题,所以今天专门写了的demo让自己记住怎么简单的使用多线程. 一直纠结的是怎么在for循环中多次实例化对象,好复现单例模式在没有加锁的情况下出现多个实例对象 ...

  5. java多线程Lock接口简介使用与synchronized对比 多线程下篇(三)

    前面的介绍中,对于显式锁的概念进行了简单介绍 显式锁的概念,是基于JDK层面的实现,是接口,通过这个接口可以实现同步访问 而不同于synchronized关键字,他是Java的内置特性,是基于JVM的 ...

  6. linux下C语言多线程编程实例

    用一个实例.来学习linux下C语言多线程编程实例. 代码目的:通过创建两个线程来实现对一个数的递加.代码: //包含的头文件 #include <pthread.h> #include ...

  7. 多线程-lock锁

    package 多线程.lock锁; import java.util.concurrent.locks.ReentrantLock; /*. * * //同步代码块 * * */ public cl ...

  8. Java单线程多实例和多线程多实例

    最近写了一个程序,是采用多线程往redis里面写入数据,想统计一下一共写了多少条数据,于是用了一个static的全局变量count来累加,这块代码抽象出来就是这样的: public class Mul ...

  9. C#多线程编程实例 线程与窗体交互

    C#多线程编程实例 线程与窗体交互 代码: public partial class Form1 : Form { //声明线程数组 Thread[] workThreads = ]; public ...

随机推荐

  1. node.js学习路线图

    http://www.admin10000.com/document/4624.html

  2. C#判断文件是复制还是剪切

    private void button1_Click(object sender, EventArgs e){IDataObject vDataObject = Clipboard.GetDataOb ...

  3. 【Java 基础篇】【第八课】package包

    学习Java以来,第一次感觉稍微有点不好理解的,下面说说吧. 存在意义: 包的存在就是为更好的组织结构 包的创建: 只要在程序的最前面加入 Package ******,就可以了,一般都喜欢写 com ...

  4. threading多线程

    什么是线程? 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务.一 ...

  5. ArcGIS API for Silverlight 调用GP服务加载等值线图层

    原文:ArcGIS API for Silverlight 调用GP服务加载等值线图层 第二篇.Silverlight客户端调用GP服务 利用ArcGIS API for Silverlight实现G ...

  6. Linq世界走一走(LINQ TO XML)

    前言:Linq to xml是一种使用XML的新方法.从本质上来说,它采用了多种当前使用的XML处理技术,如DOM和XPath,并直接在.NET Framework内将它们组合为一个单一的编程接口.L ...

  7. Ioc-Autofac实现自动的注入

    在开发过程中,最郁闷的莫过于当你新增一个Service时,你需要对该Service进行注册,有的是使用代码注入,有的是XML配置注入,不管是哪种类型的注入,经常会出现开发人员忘记注入的情况. 于是我试 ...

  8. 如何让SQLPLUS实现带日期的时间戳

    from http://www.itpub.net/thread-1876506-4-1.html SQL> defineDEFINE _DATE           = "20-7月 ...

  9. Inside Flask - Flask 简介

    Inside Flask - Flask 简介 前言 Flask 的设计目标是实现一个 wsgi 的微框架,其核心代码保持简单和可扩展性,很容易学习.对于有一定经验初学者而言,跟着例子和一些书的代码来 ...

  10. Java遇见HTML——JSP篇之JSP基础语法

    一.JSP简介 JSP全名为Java Server Pages,Java服务器端页面,其根本是一个简化的Servlet设计,它实现了在Java中使用HTML标签.Jsp是一种动态网页技术标准,是在服务 ...