gpt4 book ai didi

java - 在退出同步块(synchronized block)之前通知()?

转载 作者:行者123 更新时间:2023-11-30 09:04:44 25 4
gpt4 key购买 nike

notify() 中是否有任何用作同步块(synchronized block)中的最后一条语句?

例如:假设下面的代码在某个线程r中运行,

    synchronized(t) {
t.start();
// do stuff using t
t.notify();
}

如果我去掉这条线,我会失去什么?

    t.notify();

线程 r 已经释放了 t 的锁,并且这个锁可供等待它的人使用。

我处理的代码示例在有和没有 t.notify() 调用的情况下“表现”相同。

我能想到的唯一用途是,有点“主动”地通知 t 的监视器正在被释放,等待它的人将进入 BLOCKED状态,等待获取它。然而,在这种情况下 notify() 是同步块(synchronized block)中的最后一条语句,JVM 已经知道,通过退出同步块(synchronized block),这个锁被释放了。

这是关于理解 notify()notifyAll() 一些细节的问题。

TIA。

请注意:我看过Java notify() run before wait()?Does the position of the notify() call matter?(Java) .这是一个与那些不同的Q。

//================================

编辑:示例代码:

    public class T3 {

public static void main(String[] args){
Sum t = new Sum();
synchronized(t) {
t.start();
try {
t.wait();
} catch (InterruptedException ex) {
}
}
System.out.println("Sums up to: " + t.sum);
} // main
}

class Sum extends Thread {
int sum;

public void run() {
synchronized(this) {
for(int i = 1; i <= 55 ; sum += i++);
// notify();
}
}
}

Sum 类的 run() 如下时也是一样:

        public void synchronized run() {
for(int i = 1; i <= 55; sum += i++);
// notify();
}

最佳答案

如果您正在锁定一个线程,并且该线程终止,它会向正在等待它的任何线程发送一个 notifyAll。查看API documentation for Thread.join :

This implementation uses a loop of this.wait calls conditioned on this.isAlive. As a thread terminates the this.notifyAll method is invoked. It is recommended that applications not use wait, notify, or notifyAll on Thread instances.

在您的示例中,通知是线程完成执行之前完成的最后一件事,因此显式通知是多余的。

(请注意,此处引用的 API 文档和 Jon Skeet 都建议您不要锁定线程对象。)

关于java - 在退出同步块(synchronized block)之前通知()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25124646/

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