This question already has answers here:
Entering in block with an Intrinsic Lock
(2个答案)
5年前关闭。
当我在某个地方变红时,当我们拥有同步方法时,只有一个线程可以同时使用这些方法中的任何一个。问题是我的代码和平度很小,希望能打破此规则,我希望你们中的一些人知道为什么。
我们这里拥有的是“ waitForComplete”方法,该方法一直等到状态等于零。当主线程等待时,第二个线程处于休眠状态5秒钟,然后调用setState方法。这会将“状态”变量更改为零,并且调用会通知在主进程中等待解锁的内容。这似乎是有道理的,但问题是:当主线程同时在“ waitForComplete”方法内部时,第二个线程执行“ setState”怎么可能。两种方法都是同步的,因此应该不可能同时执行它们。
(2个答案)
5年前关闭。
当我在某个地方变红时,当我们拥有同步方法时,只有一个线程可以同时使用这些方法中的任何一个。问题是我的代码和平度很小,希望能打破此规则,我希望你们中的一些人知道为什么。
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方法。这会将“状态”变量更改为零,并且调用会通知在主进程中等待解锁的内容。这似乎是有道理的,但问题是:当主线程同时在“ waitForComplete”方法内部时,第二个线程执行“ setState”怎么可能。两种方法都是同步的,因此应该不可能同时执行它们。
最佳答案
当您调用wait()
时,线程将释放其在监视器上的锁定,因此其他线程可以自由进入同步块。