我不是在讨论已弃用的简历和暂停方法。 之前我没有使用synchronized关键字。我在一本书中看到他们使用了synchronized关键字并且我尝试了它并且它完美地工作了。你能解释一下为什么这种方法有效并且不使用synchronized吗?另外,为什么while(suspendFlag)循环也应该在synchronized块中呢?
class myThread extends Thread {
boolean suspendFlag;
myThread(String name) {
//some contructor
suspendFlag = false;
}
public void run() {
//simple loop
for (int i = 0; i < 11; i++) {
//do some thing
synchronized(this){
while (suspendFlag) {
wait();
}
}
}
}
synchronized void resumeThread(){
suspendFlag = false;
notify();
}
synchronized void suspendThread() {
suspendFlag = true;
}
}
答案 0 :(得分:2)
在while循环之前进行同步的原因是因为wait方法需要在调用之前拥有对象的互斥锁。根据java doc的wait方法说:
当前线程必须拥有此对象的监视器。该线程释放该监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待该对象监视器的线程唤醒。然后该线程等待,直到它可以重新获得监视器的所有权并继续执行。
为什么您的代码使用同步而不是没有:
您可能正在从多个线程访问相同MyThread对象的getter和setter方法,其中一个线程将读取suspendFlag的值,而其他线程可能会修改suspendFlag可能对另一个线程不可见的值,因此可以创造竞争条件。
答案 1 :(得分:0)
因为将从多个线程访问suspendFlag,所以必须同步对suspendFlag的访问,这意味着在给定时刻只有一个线程可以访问它。