public class BookShoop
    {
        public int num = 10;//共享资源
        public void Sale()
        {
            int tmp;
            lock (this) //同步控制
            {
                tmp = num;
                if (tmp > 0)
                {
                    //卖书过程
                    Thread.Sleep(1000);
                    num = num - 1;
                    Console.WriteLine("售出一本");
                }
                else
                {
                    Console.WriteLine("没有了");
                }
            }
        }    }
    class Program
    {
        static void Main(string[] args)
        {
            BookShoop a = new BookShoop();
            Thread t1 = new Thread(new ThreadStart(a.Sale));
            Thread t2 = new Thread(new ThreadStart(a.Sale));
            t1.Start();
            t2.Start();
        }
    }两个售货员,共卖一本书,这本书一共有十本,卖完为止,我两个售货员开了两个线程,共用一个变量,变量表示还剩几本书,可是程序每次只运行两次,即每个线程只运行一次,程序就退出了,也就是只卖了两本书,为什么,求高人回答,并把程序改对.

解决方案 »

  1.   

    是在if (tmp > 0)这里加循环,还是在别的地方加循环,请高手把代码帖出来啊,谢谢啊
      

  2.   

    另外你弄了个tmp干啥,难道员工卖书之前还得把书背会,不就拿几本书么,直接用num卖掉不就完了
      

  3.   

    还有那个num要加volatile 修饰
      

  4.   

    public class BookShoop
      {
         public int num = 10;//共享资源
          public void Sale()
         {
          lock (this) //同步控制
           {
             tmp = num;
             while (tmp > 0)
             {
              //卖书过程
               Thread.Sleep(1000);
              num = num - 1;
              Console.WriteLine("售出一本");
             }
           }
          }  }
      class Program
      {
          static void Main(string[] args)
          {
           BookShoop a = new BookShoop();
           Thread t1 = new Thread(new ThreadStart(a.Sale));
           Thread t2 = new Thread(new ThreadStart(a.Sale));
           t1.Start();
           t2.Start();
          }
      }我这样改了以后,可以把书卖完,可是如果我想知道哪几本书是哪位售货员卖的,该怎么改呢?谢谢啊
      

  5.   

    在thread里加个属性值就可以了
      

  6.   

    Thread t1 = new Thread(new ThreadStart(a.Sale));
    t1.Name = "售货员1";
    卖书时
    Console.WriteLine(Thread.CurrentThread.Name + "售出一本");
      

  7.   


    可以运行成功?while(tmp>0)不是恒成立么?因为你在while里面没有修改他的值
      

  8.   

       已经用了Lock(this),为什么还要用Volatile来同步线程呢????
       
        事实上,好像Lock(this)并没有同步线程,程序运行后,还会出现多卖出一本书的情况,也就是卖出了-1本书,然后程序才退出,