通常,应避免锁定 public 类型,否则实例将超出代码的控制范围;
最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Threading;
namespace ZaZhi.Core.Test
{
class Account {
private object thisLock = new object();
int balance;
Random r = new Random();
public Account(int initial) {
balance = initial;
}
int Withdraw(int amount) {
if (balance < 0)
{
throw new Exception("Negative Balance");
}
lock (thisLock)
{
if (balance >= amount)
{
Console.WriteLine("Balance before Withdrawal : " + balance);
Console.WriteLine("Amount to Withdraw : -" + amount);
balance = balance - amount;
Console.WriteLine("Balance after Withdrawal : " + balance);
return amount;
}
else {
Console.WriteLine("return 0;");
return 0; }
}
}
public void DrawTransactions()
{
for (int i = 0; i < 100; i++)
{
Withdraw(r.Next(1, 100));
}
Console.WriteLine("睡一会{0}", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(10);
Console.WriteLine("结束{0}",Thread.CurrentThread.ManagedThreadId);
}
}
[TestClass]
public class UnitTest3
{
[TestMethod]
public void TestMethod1()
{
Thread[] threads = new Thread[10];
Account account = new Account(1000);
for (int i=0;i<10;i++)
{
Thread t = new Thread(new ThreadStart(account.DrawTransactions));
//Thread t = new Thread(account.DrawTransactions);
threads[i] = t;
}
for (int i=0;i<10;i++)
{
threads[i].Start();
}
Console.WriteLine("主线程结束");
}
}
}