刚刚开始学习java,看到多线程一章,上面提到
通过使用synchronized来实现同步。
有个疑问:
1. 如果一个class中有两个函数都用synchronized标记,例如一个同步栈类有
   public synchronized char pop();
   public synchronized char push();
   按照synchronized的定义,当某个对象用synchronized 修饰时,表明该对象在任一时刻只能由一个线程访问。
   会不会同时有两个线程分别同时调用push,pop ?2. 在看到push/pop的实现时:   public synchronized void push(char c){ //加上互斥锁
     while(index = = buffer.length){ //堆栈已满,不能压栈
     try{
        this.wait(); //等待,直到有数据出栈
       }catch(InterruptedException e){}
       }   this.notify(); //通知其它线程把数据出栈
   buffer[index] = c; //数据入栈
   index++; //指针向上移动
   }     上面的代码中,this.notify()知否可以放到index++之后,
     如果不能是基于什么考虑?    Thanks !

解决方案 »

  1.   

    我开始按照PV信号量的概念去理解,觉得特别难以理解这个notify的含义。
        按照道理,此处的notify应该类似于V操作。但是,如果这样子的话,岂不是index就同时被push/pop影响了,
        这就回到了我第一个问题了.
      

  2.   

    第一个问题:不能同时调用。
    第二个问题:考虑不是很成熟,应该可以,上面的代码,效率比较高吧,notify另外一个线程
    也是需要时间的。
      

  3.   

    this.notify(); //通知其它线程把数据出栈
    这句的理解也许并不全面。也有可能通知其他线程压栈的。