java - 同步方法中是否有多个线程?

标签 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 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”方法,它会等待状态为零。当主线程等待时,第二个线程 hibernate 5 秒,然后调用 setState 方法。这会将“状态”变量更改为零,并调用通知来解锁主进程中等待的内容。这似乎有道理,但问题是:当主线程位于“waitForComplete”方法内时,第二个线程怎么可能执行“setState”。两个方法都是同步的,所以不可能同时执行。

最佳答案

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

关于java - 同步方法中是否有多个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25297338/

相关文章:

java - 为什么 1_2_3_4 在 java 中是有效的整数文字?

java:从文件或字符串获取行的接口(interface)?

java - android splitting with space 不适用于这种情况。为什么?

c# - StringBuilder类的线程安全

java - 带线程的小程序执行不清楚

python - Django 中的线程同步

读取输入文件时出现 javax.imageio.IIOException

java - 暂停线程以防止 ConcurrentModificationException?

java - 当线程进入 Java 中的同步块(synchronized block)/方法时到底发生了什么

Java的happens-before和同步