刚刚开始学习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 !
通过使用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 !
按照道理,此处的notify应该类似于V操作。但是,如果这样子的话,岂不是index就同时被push/pop影响了,
这就回到了我第一个问题了.
第二个问题:考虑不是很成熟,应该可以,上面的代码,效率比较高吧,notify另外一个线程
也是需要时间的。
这句的理解也许并不全面。也有可能通知其他线程压栈的。