您的位置:首页 > 移动开发

.net Lock(this),Lock(obj),Lock("string") console app demo,线程安全

2014-09-10 12:11 267 查看
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);

}

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐