为什么要为线程同步resume和suspend方法?

时间:2014-12-20 10:21:47

标签: java multithreading

我不是在讨论已弃用的简历和暂停方法。 之前我没有使用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;
    }

}

2 个答案:

答案 0 :(得分:2)

  1. 在while循环之前进行同步的原因是因为wait方法需要在调用之前拥有对象的互斥锁。根据java doc的wait方法说:

      

    当前线程必须拥有此对象的监视器。该线程释放该监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待该对象监视器的线程唤醒。然后该线程等待,直到它可以重新获得监视器的所有权并继续执行。

  2. 为什么您的代码使用同步而不是没有:

    您可能正在从多个线程访问相同MyThread对象的getter和setter方法,其中一个线程将读取suspendFlag的值,而其他线程可能会修改suspendFlag可能对另一个线程不可见的值,因此可以创造竞争条件。

答案 1 :(得分:0)

因为将从多个线程访问suspendFlag,所以必须同步对suspendFlag的访问,这意味着在给定时刻只有一个线程可以访问它。