Java 同步方法中有多个线程?

Java 同步方法中有多个线程?,java,multithreading,synchronized,Java,Multithreading,Synchronized,正如我在某处提到的,当我们有同步方法时,只有一个线程可以同时使用这些方法中的任何一种。问题是,我有一个小的和平的代码,看起来打破了这个规则,我希望你们中的一些人知道为什么 import java.util.Date; public class SyncTest extends Thread { private int state; public static final int STATE_STOP = 10; public static final int STA

正如我在某处提到的,当我们有同步方法时,只有一个线程可以同时使用这些方法中的任何一种。问题是,我有一个小的和平的代码,看起来打破了这个规则,我希望你们中的一些人知道为什么

import java.util.Date;

public class SyncTest extends Thread {

    private int state;

    public static final int STATE_STOP = 10;
    public static final int STATE_DO_TASK = 2;
    public static final int STATE_FREE = 0;

    public void run() { 
        try {
            while(getThisState() != STATE_STOP) {
                if(getThisState() == STATE_DO_TASK) {
                    Thread.sleep(2000);
                    setState(0);
                }
            }
        }catch(Exception ex) {
            ex.printStackTrace();
        }
    }

    public synchronized void setState(int newState) {
        this.state = newState;
        this.notify();
    }

    public synchronized int getThisState() {
        return this.state;
    }       

    public synchronized void waitForComplete(int timeoutMilisec) {  
        try {
            while( getThisState() != STATE_FREE) {
                    wait(timeoutMilisec);
            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {        
        SyncTest syncTest = new SyncTest();
        syncTest.start();
        syncTest.setState(STATE_DO_TASK);
        System.out.println("Start operation: " + new Date());
        syncTest.waitForComplete(30000);            
        syncTest.setState(STATE_STOP);
        System.out.println("End operation: " + new Date());
    }   

}

我们这里有一个“waitForComplete”方法,它等待状态等于零。当主线程等待时,第二个线程休眠5秒,然后调用setState方法。这会将“state”变量更改为零,并调用通知主进程中等待解锁的内容。这似乎有道理,但问题是:当主线程在“waitForComplete”方法中时,第二个线程怎么可能执行“setState”。这两个方法都是同步的,因此不可能同时执行它们。

当您调用
wait()
时,线程会释放其在监视器上的锁,因此其他线程可以自由进入同步块。

当您调用
wait()
时,线程会释放其在监视器上的锁,因此,其他线程可以自由进入同步块。

“只有一个线程可以同时使用这些方法中的任何一种”如果您阅读本文,这是不正确的,尽管这是一个常见的误解。您不能锁定一个方法,并且在同一个同步方法中可以有任意数量的线程。对于一个对象,只有一个线程可以在锁定该对象时运行。“只有一个线程可以同时使用这些方法中的任何一种”如果您阅读本文,这是不正确的,尽管这是一个常见的误解。您不能锁定一个方法,并且在同一个同步方法中可以有任意数量的线程。对于一个对象,只有一个线程可以在锁定该对象时运行。