gpt4 book ai didi

java - 为什么我们在这个类方法中使用同步块(synchronized block)?

转载 作者:行者123 更新时间:2023-12-02 11:08:21 24 4
gpt4 key购买 nike

最近开始学习Java多线程,遇到了书上的一个例子。事情是这样的。

class NewThread implements Runnable {
String name;
Thread t;
boolean suspendFlag;
NewThread(String threadname) {
name = threadname;
t = new Thread(this, name);
System.out.println("New thread: " + t);
suspendFlag = false;
t.start();
}

public void run() {
try {
for(int i = 15; i > 0; i--) {
System.out.println(name + ": " + i);
Thread.sleep(200);
synchronized(this) {
while(suspendFlag) {
wait();
}
}
}
} catch (InterruptedException e) {
System.out.println(name + " interrupted.");
}
System.out.println(name + " exiting.");
}
synchronized void mysuspend() {
suspendFlag = true;
}
synchronized void myresume() {
suspendFlag = false;
notify();
}
}

class Te {
public static void main(String args[]) {
NewThread ob1 = new NewThread("One");
NewThread ob2 = new NewThread("Two");
try {
Thread.sleep(1000);
ob1.mysuspend();
System.out.println("Suspending thread One");
Thread.sleep(1000);
ob1.myresume();
System.out.println("Resuming thread One");
ob2.mysuspend();
System.out.println("Suspending thread Two");
Thread.sleep(1000);
ob2.myresume();
System.out.println("Resuming thread Two");
} catch (InterruptedException e) {
System.out.println("Main thread Interrupted");
}
try {
System.out.println("Waiting for threads to finish.");
ob1.t.join();
ob2.t.join();
} catch (InterruptedException e) {
System.out.println("Main thread Interrupted");
}
System.out.println("Main thread exiting.");
}

}

现在,在这个示例中,正如您所看到的,有一个恢复和一个挂起方法,该方法在程序的主方法中被调用几次。但是当我删除 run 方法中的同步块(synchronized block)时,它会显示类似这样的错误。

Exception in thread "Two" java.lang.IllegalMonitorStateException

我实际上想知道,为什么我们需要 while 语句的同步块(synchronized block)。当 suspendFlag 的值改变时, while 不恢复吗?

最佳答案

如果没有同步,可能会发生以下情况:

线程 A 可以检查 suspendFlag 并发现它是 true,

线程 B 可以设置 suspendFlag=false;,然后调用 notify();

然后线程 A 可以调用 wait() (因为 suspendFlag 在检查时为 true。),现在线程 A 挂起,等待永远不会出现的通知。发生。

同步可以防止线程 B 在线程 A 检查挂起标志的时刻和线程 A 实际开始等待通知的时刻之间更改它。

关于java - 为什么我们在这个类方法中使用同步块(synchronized block)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50760532/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com