两个线程,调用一方法,该方法有线程锁,若线程一进入这个线程锁内执行(时间较长),此时另一线程也在也在进入该方法内,但有线程锁,故线程二处于等待状态,当线程一执行完时,线程二会不会自动重新执行被上锁的代码块?????????

解决方案 »

  1.   

    http://topic.csdn.net/u/20110120/11/274fc9d3-664c-49f0-ba49-9d745f612b3f.html
    这个是你提过的问题,你有没有尝试过回复中的修改啊.
    private static object balanceLock = new object();
    要写成静态的,这样两个或者多个类的实例,才可以锁住同一个对象.
      

  2.   

    那就是你没写对,如果写对的话,应该是下面的过程....上锁
    DoAnything
    ....去锁当地一个线程进入后,执行DoAnything,这时第二个线程就在一边等候,当第一个完成后,并去锁,第二个进入开始执行DoAnything
      

  3.   

    public class Test
    {
        public static void Main()
        {
            //BankAccount bk = new BankAccount();
            ParameterizedThreadStart paraterThreadStart = new ParameterizedThreadStart(BankAccount.Deposit);
            Thread thread = new Thread(paraterThreadStart);
            thread.Start(10000);       // BankAccount bk2 = new BankAccount();
            ParameterizedThreadStart paraterThreadStart2 = new ParameterizedThreadStart(BankAccount.Deposit);
            Thread thread2 = new Thread(paraterThreadStart2);
            thread2.Start(1000);
            Console.WriteLine("线程1状态{0};线程2状态{0}", thread.ThreadState, thread2.ThreadState);
            Console.ReadLine();
        //Thread.Sleep(1000);    
            Console.WriteLine("主线程输出");
            Console.ReadLine();
        }}
    public class BankAccount
    {
        private int balance2;
        public int Balance
        {
            set { balance2 = value; }
            get { return balance2; }
        }
        private static object balanceLock = new object();
        public static void Deposit(object delta)
        {
            Monitor.Enter(balanceLock);
            try
            {
                int balance = 0;
                string str = "0";
                using (StreamReader sr = new StreamReader(@"D:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\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(@"D:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\text.txt", false))
                {
                    sw.Write(balance);
                    sw.Close();
                }            Console.WriteLine("{0}", balance);
                Console.ReadLine();
            }
            finally
            {
                Monitor.Exit(balanceLock);
            }    }}
      

  4.   

    你最初那个代码就可以,仅仅修改static那句,不用改成monitor
      

  5.   


    1、main 方法不变
    2、调用类代码简化
        public class BankAccount
        {
            private static object balanceLock = new object();
            public static void Deposit(object delta)
            {
                int data = int.Parse(delta.ToString());            Monitor.Enter(balanceLock);
                try
                { 
                    Console.WriteLine("curr thread : {0}",data.ToString());                Thread.Sleep(TimeSpan.FromMinutes(TimeSpan.FromSeconds(10)));
                }
                finally
                {
                    Monitor.Exit(balanceLock);
                }
            }
        }执行结果:线程1状态Running;线程2状态Running
    主线程输出
    curr thread : 1curr thread : 2
      

  6.   

    public class Test
    {
        public static void Main()
        {
            //BankAccount bk = new BankAccount();
            ParameterizedThreadStart paraterThreadStart = new ParameterizedThreadStart(BankAccount.Deposit);
            Thread thread = new Thread(paraterThreadStart);
            thread.Start(1000000);       // BankAccount bk2 = new BankAccount();
            ParameterizedThreadStart paraterThreadStart2 = new ParameterizedThreadStart(BankAccount.Deposit);
            Thread thread2 = new Thread(paraterThreadStart2);
            thread2.Start(1000);
            Console.WriteLine("线程1状态{0};线程2状态{0}", thread.ThreadState, thread2.ThreadState);
            Console.ReadLine();    }}