public class Test
{
    public static void Main()
    {
        BankAccount bk = new BankAccount();
        ParameterizedThreadStart paraterThreadStart = new ParameterizedThreadStart(bk.Deposit);
        Thread thread = new Thread(paraterThreadStart);
        thread.Start(100000000);        BankAccount bk2 = new BankAccount();
        ParameterizedThreadStart paraterThreadStart2 = new ParameterizedThreadStart(bk2.Deposit);
        Thread thread2 = new Thread(paraterThreadStart2);
        thread2.Start(1000);    //Thread.Sleep(1000);    
        Console.WriteLine("主线程输出");
        Console.ReadLine();
    }}
public class BankAccount
{
    private int balance;
    public int Balance
    {
        set { balance = value; }
        get { return balance; }
    }
    private  object balanceLock = new object();
    public  void Deposit(object delta)
    {
        lock (balanceLock)
        {
            string str="0";
            using (StreamReader sr = new StreamReader(@"c:\text.txt", System.Text.Encoding.GetEncoding("GB2312")))
            {
                 str= sr.ReadToEnd();
                sr.Close();
            }
            //Thread.Sleep(int.Parse(delta.ToString()));
            for (int i = 0; i < (int)delta; i++)
            { int t = i; }
            
            balance = (int)delta + int.Parse(str);
            using (StreamWriter sw = new StreamWriter(@"c:\text.txt", false))
            {
                sw.Write(balance);
                sw.Close();
            }
        
            Console.WriteLine("{0}", balance);
            Console.ReadLine();
        }
    }}
当第一线程参数是小于100000000时,线程锁起作用。但当输入200000000时,线程锁不起作用?????郁闷ING

解决方案 »

  1.   

    balanceLock要写成静态的,否则两个实例锁了两个不同的对象,没有意义.
      

  2.   

    操作bk1又不会锁住bk2(不用的账号拥有各自的锁),你期望得到什么效果?
      

  3.   

    在测试线程锁的作用,在我的理解,就是对象中某代码块加了线程锁的话,应该有排它性。但比测试来说,这个Lock()并没有这个功能,在第一个线程输入参数1亿时,控制台输出 100000000   100001000  当第一参数是2亿时输出1000  2000000000
      

  4.   

    private static object balanceLock = new object();
    写成这样.
      

  5.   

    BankAccount bk2 = new BankAccount();
      ParameterizedThreadStart paraterThreadStart2 = new ParameterizedThreadStart(bk.Deposit);
      Thread thread2 = new Thread(paraterThreadStart2);
      thread2.Start(1000);
    把第二个线程也改成对象bk,第二个线程没有执行到,不解????????????