C# 多线程 lock 实例
2016-02-20 21:37
567 查看
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("我是未被锁定 :)");
}
}
{
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#调用CMD程序
- C#中毫米与像素的换算方法
- C#中using与添加引用的区别
- C# thread类
- C#继承/this/base/new
- C#中Math.Round()实现中国式四舍五入
- C# Random 生成不重复随机数
- 【C#学习之辨析小总结】
- C#之日志
- C#学习——字符串
- c# 扩展方法 奇思妙想 推荐酷。
- StructLayout特性
- 关于C#托管代码与非托管代码的理解
- (转)C#程序开发中经常遇到的10条实用的代码
- C# WPF获取任务栏时间区域的Rectangle
- C# WPF 让你的窗口始终钉在桌面上
- [置顶]10年C#之旅,终获MVP,感谢博客园这个舞台。。。。。
- [置顶]群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法【附C#群蚁算法完整项目代码】
- [置顶]白话贝叶斯理论及在足球比赛结果预测中的应用和C#实现
- 【原创】C#搭建足球赛事资料库与预测平台(6) 赔率数据表设计2