.net Lock(this),Lock(obj),Lock("string") console app demo,线程安全
来源:互联网 发布:csgo游戏优化 编辑:程序博客网 时间:2024/06/07 06:18
class Program
{
static object obj = new object();
static int balance = 500;
static void Main(string[] args)
{
//todo with lock,Safe thread
//Thread t1 = new Thread(new ThreadStart(Credit));
//t1.Start();
//Thread t2 = new Thread(() => Debit());
//t2.Start();
//todo without lock,thread not safty
//Thread t1 = new Thread(new ThreadStart(CreditNoLock));
//t1.Start();
//Thread t2 = new Thread(() => DebitNoLock());
//t2.Start();
//todo new instance,lock (this---context),Lock Failed
//var account = new Account();
//Thread t1 = new Thread(new ThreadStart(account.Credit));
//t1.Start();
//var account2 = new Account();
//Thread t2 = new Thread(() => account2.Debit());
//t2.Start();
//todo new instance,lock (obj-syncRoot),Lock Successed
var account = new Account();
Thread t1 = new Thread(new ThreadStart(account.CreditLockObj));
t1.Start();
var account2 = new Account();
Thread t2 = new Thread(() => account2.DebitLockObj());
t2.Start();
//todo 结论!! lock(this)只对当前instance有效,lock(obj)安全,lock("string字符串")无意义
Console.ReadKey();
}
static void Credit()
{
lock (obj)
{
for (int i = 0; i < 15; i++)
{
Thread.Sleep(500);
balance += 100;
Console.WriteLine("After crediting,balance is {0}", balance);
}
}
}
private static void Debit()
{
lock (obj)
{
for (int i = 0; i < 15; i++)
{
Thread.Sleep(500);
balance -= 100;
Console.WriteLine("After debiting,balance is {0}", balance);
}
}
}
static void CreditNoLock()
{
for (int i = 0; i < 15; i++)
{
Thread.Sleep(1000);
balance += 100;
Console.WriteLine("After crediting,balance is {0}", balance);
}
}
private static void DebitNoLock()
{
for (int i = 0; i < 15; i++)
{
Thread.Sleep(1000);
balance -= 100;
Console.WriteLine("After debiting,balance is {0}", balance);
}
}
}
public class Account
{
static int balance = 500;
static object obj = new object();
public void Credit()
{
lock (this)
{
for (int i = 0; i < 5; i++)
{
Thread.Sleep(1000);
balance -= 100;
Console.WriteLine("After debiting,balance is {0}", balance);
}
}
}
public void Debit()
{
lock (this)
{
for (int i = 0; i < 5; i++)
{
Thread.Sleep(1000);
balance += 100;
Console.WriteLine("After debiting,balance is {0}", balance);
}
}
}
public void CreditLockObj()
{
lock (obj)
{
for (int i = 0; i < 5; i++)
{
Thread.Sleep(1000);
balance -= 100;
Console.WriteLine("After debiting,balance is {0}", balance);
}
}
}
public void DebitLockObj()
{
lock (obj)
{
for (int i = 0; i < 5; i++)
{
Thread.Sleep(1000);
balance += 100;
Console.WriteLine("After debiting,balance is {0}", balance);
}
}
}
{
static object obj = new object();
static int balance = 500;
static void Main(string[] args)
{
//todo with lock,Safe thread
//Thread t1 = new Thread(new ThreadStart(Credit));
//t1.Start();
//Thread t2 = new Thread(() => Debit());
//t2.Start();
//todo without lock,thread not safty
//Thread t1 = new Thread(new ThreadStart(CreditNoLock));
//t1.Start();
//Thread t2 = new Thread(() => DebitNoLock());
//t2.Start();
//todo new instance,lock (this---context),Lock Failed
//var account = new Account();
//Thread t1 = new Thread(new ThreadStart(account.Credit));
//t1.Start();
//var account2 = new Account();
//Thread t2 = new Thread(() => account2.Debit());
//t2.Start();
//todo new instance,lock (obj-syncRoot),Lock Successed
var account = new Account();
Thread t1 = new Thread(new ThreadStart(account.CreditLockObj));
t1.Start();
var account2 = new Account();
Thread t2 = new Thread(() => account2.DebitLockObj());
t2.Start();
//todo 结论!! lock(this)只对当前instance有效,lock(obj)安全,lock("string字符串")无意义
Console.ReadKey();
}
static void Credit()
{
lock (obj)
{
for (int i = 0; i < 15; i++)
{
Thread.Sleep(500);
balance += 100;
Console.WriteLine("After crediting,balance is {0}", balance);
}
}
}
private static void Debit()
{
lock (obj)
{
for (int i = 0; i < 15; i++)
{
Thread.Sleep(500);
balance -= 100;
Console.WriteLine("After debiting,balance is {0}", balance);
}
}
}
static void CreditNoLock()
{
for (int i = 0; i < 15; i++)
{
Thread.Sleep(1000);
balance += 100;
Console.WriteLine("After crediting,balance is {0}", balance);
}
}
private static void DebitNoLock()
{
for (int i = 0; i < 15; i++)
{
Thread.Sleep(1000);
balance -= 100;
Console.WriteLine("After debiting,balance is {0}", balance);
}
}
}
public class Account
{
static int balance = 500;
static object obj = new object();
public void Credit()
{
lock (this)
{
for (int i = 0; i < 5; i++)
{
Thread.Sleep(1000);
balance -= 100;
Console.WriteLine("After debiting,balance is {0}", balance);
}
}
}
public void Debit()
{
lock (this)
{
for (int i = 0; i < 5; i++)
{
Thread.Sleep(1000);
balance += 100;
Console.WriteLine("After debiting,balance is {0}", balance);
}
}
}
public void CreditLockObj()
{
lock (obj)
{
for (int i = 0; i < 5; i++)
{
Thread.Sleep(1000);
balance -= 100;
Console.WriteLine("After debiting,balance is {0}", balance);
}
}
}
public void DebitLockObj()
{
lock (obj)
{
for (int i = 0; i < 5; i++)
{
Thread.Sleep(1000);
balance += 100;
Console.WriteLine("After debiting,balance is {0}", balance);
}
}
}
}
0 0
- .net Lock(this),Lock(obj),Lock("string") console app demo,线程安全
- c# lock (obj) 与 lock (this) 区别
- c# lock (obj) 与 lock (this) 区别
- c# lock (obj) 与 lock (this) 区别
- c# lock (obj) 与 lock (this) 区别
- 使用lock确保线程安全
- 使用lock确保线程安全
- lock-free线程安全算法
- lock语句和线程安全
- LOCK
- LOCK
- lock
- lock
- Lock
- Lock()
- lock
- LOCK
- Lock
- 【网络安全】SSLSplit源码流程分析-中间人攻击
- 设计模式之单例模式
- 智能家居控制器电源解决方案探讨_金升阳模块电源
- EditText加入图片混编显示
- 数据挖掘之聚类篇
- .net Lock(this),Lock(obj),Lock("string") console app demo,线程安全
- 随笔分类 - NoSql
- 华为-翻译电话号码
- 澳洲联储中午将首先打响本周五国利率决议第一枪
- 动词的使役
- UVA - 10296 Jogging Trails (中国邮路问题)
- 在vs中导入项目
- Webkit学习 --- 解析HTML获取网页子资源流程
- 自己动手写CPU之第七阶段(11)——除法指令实现过程2