gpt4 book ai didi

java - 如何理解这个简单的线程例子呢?

转载 作者:行者123 更新时间:2023-12-01 07:28:04 24 4
gpt4 key购买 nike

这是一个关于Java并发中wait()notify()的例子。我关于它的理论知识并不能解释我对这段代码的理解,我也无法解释为什么这会给我一个被误解的结果。

所以,这是获得想法的代码:

public class ExampleOne {
public static void main(String[] args) {
Test b = new Test();
b.start();
synchronized(b){
try{
b.wait();
} catch(InterruptedException ex){
ex.printStackTrace();
}
System.out.println(b.total);
}
}
}

class Test extends Thread {
int total;

@Override
public void run(){
synchronized(this){
for(int i =0;i<50;i++){
total+=i;
System.out.println("I am here");
}
notify();
}
}
}

结果是:4950

那么,如何理解这个过程(total怎么可能是4950)?

据我所知,如果我调用wait(),它会停止调用此方法的对象线程并唤醒它,然后另一个线程调用notify()。另外,synchronized() block 会限制线程,并且一次仅接受一个线程。

  • 因此,当线程调用notify()时,它会变为非 Activity 状态,直到其他线程线程调用wait()?

  • wait()和notify()在这段代码中如何发挥作用?还有 synchronized() block ?

  • 那么,这段代码中创建了多少个线程?

我对此感到困惑。帮我弄清楚。

最佳答案

If I call wait() it stops the object's thread which called this method and woken up it then another thread calls notify()

对。 相同对象实例上的 notify() notifyAll() 将唤醒线程。

So when thread calls notify(), it becomes non-active until other thread calls wait()?

没有。 Notify 只是向正在等待同一对象的线程发出信号。调用 notify() 的线程继续运行,并且不会释放它所持有的 synchronized 锁。

How wait() and notify() play it's role in this code?

无需等待/通知。主线程不会等待计算完成,因此可能会打印 0。

Also synchronized() block?

当您使用wait()notify()时,您需要处于synchronized block 中。它是与您正在同步的对象实例关联的监视器,正在等待并收到通知。此外,synchronized block 可确保内存同步,以便主线程看到notify 字段的更改。每个线程都有一个内存缓存,并且需要有适当的机制供线程发布其更改并查看其他线程对字段所做的更改。

So, how many threads are created in this code?

1 个线程由您的代码创建,主线程由 JVM 自动创建。

重要的是要认识到此代码中存在竞争条件。新线程有可能在主线程实际调用 wait 之前启动、循环循环、调用通知并退出。这不太可能发生,因为启动线程需要一些时间,但它可能会发生。在这种情况下,主线程将永远陷入 wait 状态,因为没有人通知它。

其他一些评论:

  • 我建议您使用this.notify()。重申通知的内容总是好的。
  • 正如 @JBNizet 指出的,最好使用 private final 锁定对象,而不是 Thread 对象。
  • 始终建议定义一个实现 Runnable 的类,而不是扩展线程。然后你会做 new Thread(new TestRunnable()); ...

关于java - 如何理解这个简单的线程例子呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21078476/

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