在退出synch'd块之前notify()?

时间:2014-08-04 17:52:32

标签: java multithreading

notify()中使用任何作为同步&#d; d块中的最后一个语句?

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

    synchronized(t) {
        t.start();
        // do stuff using t
        t.notify();
    }
如果我删除该线,我会松开什么?

    t.notify();

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

我工作过的代码示例"表现良好"有和没有t.notify()调用的那个相同。

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

这是关于理解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();
            }
        }
    }

run()的{​​{1}}如下所示:

Sum

2 个答案:

答案 0 :(得分:1)

是。它允许wait() t上的其他线程再次运行,而不是等待永远不会发出的通知。

答案 1 :(得分:1)

如果你锁定一个线程,并且该线程终止,它会向任何等待它的线程发送notifyAll。请参阅API documentation for Thread.join

  

此实现使用this.wait调用on.isAlive的循环。当一个线程终止时,将调用this.notifyAll方法。建议应用程序不要在Thread实例上使用wait,notify或notifyAll。

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

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