【发布时间】:2020-11-14 15:51:13
【问题描述】:
我开始在 uni 学习多线程,虽然我开始大致了解这个概念,但我也在玩一些例子,以了解它在实践中是如何工作的。我对以下课程的问题是:
它按预期工作,如果我将 getter/setter 与我的对象锁同步,那么主线程将 boolean done 设置为 true,run() 中的 while 循环中断,main 只是等待终止通过 join() 说明的工人。最后打印出来了,我很高兴。在这里也许您可以帮助我理解,为什么同步 getter/setter for done 很重要,但 getter for count 是否同步似乎并不重要。
但我真正的问题是,我不明白为什么工作线程永远不会终止,如果我在主方法内的同步块/关键部分中使用 setter 设置布尔值。然后它似乎永远运行并且 main 等待它,因为 join()。另一方面,当我让它通过 IntelliJ 调试器运行时,它似乎最终会终止,但在正常运行的情况下,它只会永远运行。为什么呢?据我在关键部分的理解,当布尔值设置为 true 时,run() 中正在运行的 while 循环应该在短时间内注意到这一点并终止 worker?
public class VisibilitySynchronized extends Thread {
private static Object lock = new Object();
private boolean done = false;
public long counter = 1;
public boolean getDone() {
//synchronized (lock) {
return this.done;
//}
}
public long getCounter() {
//synchronized(lock) {
return this.counter;
//}
}
public void setDone(boolean changeDone){
//synchronized(lock) {
this.done = changeDone;
//}
}
@Override
public void run() {
while (!getDone()) {
counter++;
}
}
public static void main(String[] args) throws InterruptedException {
Thread main = Thread.currentThread();
main.setName("I am the main thread executing the main method right now and am ybout to start
a worker of the class VisibilitySynchronized");
System.out.println("Main Thread is: " + main.getName());
VisibilitySynchronized worker = new VisibilitySynchronized();
worker.start();
Thread.sleep(1000);
synchronized (lock) {
worker.setDone(true);
}
//worker.setDone(true); this would be working if method was synchronized
System.out.println("Waiting for other Thread to terminate...");
System.out.println("Done in worker is " + worker.getDone());
worker.join();
System.out.printf("Done! Counted until %d.", worker.getCounter());
}
}
【问题讨论】:
-
添加你的类的使用示例。
-
您是否在问:“如果 getDone 和 setDone 方法在锁定时同步,为什么这不起作用”或问您:“如果 getDone 和 setDone 方法未同步,为什么这不起作用锁定”或者您是在问:我是否锁定并不重要,无论哪种方式,yield() 调用都不会返回?
-
@Pavlus 对不起,我不确定,如果我理解的话,我的 main 方法中使用了 VisibilitySynchronized 类?不知道我还能举出什么样的例子?
-
好吧,那么我正确地解释了你的问题 - 请参阅我的广泛回答,它准确解释了为什么没有 -synchronized- 它无法工作。
-
setDone() 在同步中被调用,但 getDone() 不是。
标签: java multithreading concurrency parallel-processing synchronized