多线程 - 关于Java中 Object.notify()方法的疑问
黄舟
黄舟 2017-04-18 10:33:20
[Java讨论组]
package com.chong;

public class Main {

    
    public static void main(String args[]){
        
        
        Object obj=new Object();
        
        Thread t1=new Thread(new Runnable() {
            
            @Override
            public void run() {
                synchronized (obj) {
                    
                    try {
                        obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("t1 end");
                }
            }
        });
        
        Thread t2=new Thread(new Runnable() {
            
            @Override
            public void run() {
                synchronized (obj) {
                    obj.notify();
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("t2 end");
                }
            }
        });
        
        t1.start();
        
        t2.start();
        
    }
}

如上代码,结果是:
t2先执行完,t1后执行完。

查资料,notify()方法是通知一个等待在该对象上的线程,不会释放锁。

那么,obj.notify()方法,写在同步代码块里的最开始或者最末尾处,jvm内部处理逻辑上有什么差异吗?平时写代码,在这里有什么需要注意的点吗?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(4)
大家讲道理

你这么写只是个演示代码,wait()和notify()是配合生产者-消费者模型使用的。Android中的Volley框架也是使用这种原理来进行多线程的并发调度。
不需要考虑JVM,你只需要考虑释放时机和通知时间,建议参考我的这篇博客:Java并发写作——wait-notify机制

PHP中文网

引用jdk6中wait方法的注释

The current thread must own this object's monitor. The thread
releases ownership of this monitor and waits until another thread notifies threads waiting on this object's monitor to wake up either through a call to the notify method or the notifyAll method.

对应到题主的代码wait调用后会释放obj对象的锁。
另外,sleepyield方法是不会释放对象锁的。

ringa_lee

没问题,这个答案。如果没有wait,那么notify有毛用

PHP中文网

你这代码应该会出现t2执行完,t1不会执行完的情况,这叫过早的notify,你应该确保线程1总是先于2执行才行。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号