问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Java 线程中调用wait为什么一定要在同步代码块中?

发布网友 发布时间:2022-05-03 01:17

我来回答

3个回答

热心网友 时间:2023-10-10 08:41

wait是让使用wait方法的对象等待,暂时先把对象锁给让出来,给其它持有该锁的对象用,其它对象用完后再告知(notify)等待的那个对象可以继续执行了,因此,只有在synchronized块中才有意义(否则,如果大家并不遵循同步机制,那还等谁呢?根本没人排队,也就谈不上等待和唤醒了)
以下是一个例子,用以展示这种机制:

    public class ThreadA {  
        public static void main(String[] args) {  
            ThreadB b = new ThreadB();  
            b.start();//主线程中启动另外一个线程  
            System.out.println("b is start....");  
            //括号里的b是什么意思,应该很好理解吧  
            synchronized(b) {  
                try {  
                    System.out.println("Waiting for b to complete...");  
                    b.wait();//这一句是什么意思,究竟谁等待?  
                    System.out.println("ThreadB is Completed. Now back to main thread");  
                    }catch (InterruptedException e){}  
            }  
            System.out.println("Total is :" + b.total);  
            }  
    }  
      
    class ThreadB extends Thread {  
            int total;  
            public void run() {  
                synchronized(this) {  
                    System.out.println("ThreadB is running..");  
                    for (int i=0; i<=100; i++ ) {  
                        total += i;  
                    }  
                    System.out.println("total is " + total);  
                    notify();  
                }  
            }  
    }


运行结果:
b is start....
Waiting for b to complete...
ThreadB is running..
total is 5050
ThreadB is Completed. Now back to main thread
Total is :5050

热心网友 时间:2023-10-10 08:41

楼上的回答不负责任,API中这样描述:
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。换句话说,此方法的行为就好像它仅执行 wait(0) 调用一样。
当前的线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等待,直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒来。然后该线程将等到重新获得对监视器的所有权后才能继续执行。

对于某一个参数的版本,实现中断和虚假唤醒是可能的,而且此方法应始终在循环中使用:

synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
}
此方法只应由作为此对象监视器的所有者的线程来调用

注意最后一句: 此方法只应由作为此对象监视器的所有者的线程来调用。如果不给当前对象加锁,你无法拥有当前对象。

热心网友 时间:2023-10-10 08:42

因为这个wait就是专门为同步设计的。。。。。。。。。

专门为它设计的,不在它里边用在哪哈儿用呢??
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
单位高温防护欠缺致员工中暑如何对待 狗狗为什么爱看视频 360浏览器怎么设置倍速播放 ...先讲女主的灵魂飘荡了一段时间,然后重生,请问是那本? 拯救者散热器怎么开 电脑如何一键还原系统电脑一键还原怎么操作 神舟笔记本电脑怎么重新设置神舟战神bios恢复出厂设置 神舟电脑恢复出厂设置神舟战神怎么恢复原厂系统 水泥楼梯如何铺木楼梯 家里面楼梯是水泥的不想铺地毯或者地砖还能铺什么 关于自行车研究课题的结题报告,很急 c语言中API函数的使用 自行车研究报告 我想研究的问题: 我们想研究的问题: C++里怎么调用wait 关于自行车的研究报告(500字左右) 急急急急急急急急急急急急急急急急! 新强联哪个领域最值得买?新强联2021年度报告全文?新强联今天有机构调研吗? 线程wait() notify if while 涂料胶粘剂产品经理是干嘛的 曾经风靡全国的痞子派鼻祖作家王朔,为何作品现在无人问津? 临沂目前痞子数量是多少? 痞子的作品有哪些? 谁知道“流氓”一词的来历啊? 为什么要有“流氓”一词?它的来源是哪? 为什么台湾偶像剧“和”字要读成han第四声 诺基亚系列不带GPS导航的手机。 报价 哪一个更好一些?功能上有什么区别? 不带GPS的手机可以装电子地图吗?比如呢? 不带gps功能的手机 我上微信 查找附近的人 别人能看到我吗? 不带GPS卫星导航的手机能装GOOGLE的地图代替吗? 手机不带GPS系统的装个软件就行了吗 华为手机怎么不带gps 关于自行车研究课题的结题报告,很急,要短,给所有分 中国应如何应对美国商务部启动反倾销、反补贴调查? 我们想研究的问题: 1为什么变速器上有那么多个齿轮? windows 多线程问题 用windows api提供的函数创建4个线程 并用WaitForMultipleObjects 但结果有问题 API函数GetMenuItemCount的用法 中国连续多少年成全球遭遇反倾销调查最多国家? API函数怎么执行实现的? 土耳其多少人口 土耳其人 土耳其人科森(Sultan Kosen)有多高 土耳其到底是欧洲人还是阿拉伯人,怎么军队中好多长的象西欧人的金发 棕发 长脸? 请问土耳其人的平均身高 没有进行学生票优惠资质核验,先在网上买了学生票,可以到站再核验吗?可以刷身份证进站? 世界最高的人是谁 土耳其有多少人 程序员(软考)都考些什么、c语言、数据结构、软件工程、java还有其他的什么没有。。。具体点的。非常感谢 嘴唇有一块变白了是什么意思。 学生票第二次买票需要核验吗 嘴唇一半红润一半发白怎么回事 嘴唇一块发白,会不会是白癜风,按压白的更厉害,已经有好几个月了!