【求助】新人求助-------有关java synchronized的问题。

21 阅读1分钟
public class WaitThread {

    public static void main(String[] args) {
        CalcThread calcThread = new CalcThread();
        calcThread.start();
        synchronized (calcThread) {
            //try {
            //    calcThread.wait();
            //} catch (InterruptedException e) {
            //    e.printStackTrace();
            //}

            System.out.println("Total is: " + calcThread.total);
        }

    }

    static class CalcThread extends Thread {
        int total;

        @Override
        public void run() {
            synchronized (this) {
                for (int i = 0; i < 100; i++) {
                    total += i;
                }
                notify();
            }
        }
    }
}

新手入坑,求助各位大佬们解惑。
感谢感谢感谢!!!
我想问一下,上面代码运行时,因为同步块的原因main会优先一步获得calcThread对象的锁,而calcThread线程会进入锁等待阶段,从而先执行mian方法中的打印操作。也就是最后的输出结果是:Total is: 0
但是当注释的代码打开的时候,在同步块内调用calcThread.wait()。
我的想法是,这里不是让线程calcThread进入等待并且释放calcThread持有的锁吗?按理说锁应该还是在main手上,这样的话calcThread run里面的notify根本无法执行。最后的打印结果应该仍然是Total is: 0
实际上输出是Total is: 4950,wait释放的是main持有的calcThread的锁,使main方法进入等待,等待线程calcThread调用notify,唤醒main的线程,使自己继续进入BLOCKED状态。
看到这里我晕了,所以想问一下,这里的wait、notify到底作用在谁身上??