java里多线程的wait问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java里多线程的wait问题相关的知识,希望对你有一定的参考价值。

如果一个可被多个线程访问的资源类的某一个synchronized方法里有wait(),当这个wait()被调用时,是让当前进入到synchronized方法的这个线程进入wait,还是这个资源类进入wait?如果是线程进入wait,那为什么不是在线程类上调用wait()而是在资源类里调用(这里的wait()实际上应该是this.wait())?

如果资源类里是这样的
public synchronized void f()
while(condition)
wait();

System.out.println("f() return;")

那是不是运行到这个循环的时候,进入wait、等待notify并释放锁,但是这个方法并没有返回(控制台没输出)?
condition只是一个用来举例子的条件变量,如果条件不成熟,进入等待,否则就跳过循环执行后面的代码,这里只是示意wait()被执行的条件。

我的问题就是,为什么既然是线程wait,wait()方法却不在线程里调用而是在对象上调用?API里这么说“Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object.”,是不是实说对象上的wait()被执行的时候,使current thread 进入wait状态?也就是说wait()可以自动识别当前的线程?

我这样给你说不知道你理解不理解,可能我的例子举的不好你看不明白。在谈到多线程的时候我们常说的一个概念是锁。这里我们把它想象成为一把真正的锁。把线程想象成一个个动态的人,他们想进去一个屋子,但是通往这个屋子的门有一个洞,这个洞只能同时一个人钻进去。这就相当于synchronized 的作用。这个屋的们上有一把锁。锁就等于condition。满足这个条件就相当于能打开锁。这时要注意这个锁指只能挂在屋的门上的,就相当于你说的资源类上面。而不能挂在人上面,因为人是动态的,挂在某个人身上别的人就找不到了。其实在jvm里面它是用跟资源类相关的一个标志位来表示的。不知道这样解释可否。追问

这个我知道,所以说wait的是人,但是wait()、notify()、notifyAll()却在屋子上?

追答

不是在屋子上,是挂在某一个资源上,相当于把钥匙放在一个小盒子里,每个线程来的时候先去盒子里面取钥匙,取不到就wait。总不能把这个钥匙放在自己身上吧。

参考技术A 喜欢思考绝对是好事,但我希望你对于一个为题你能自己分析的透彻点,wait()当然是线程去等待,线程讲的就是电脑的cpu如何工作,而你说的资源了只是数据也就是你给电脑的一种指令,数据有什么等待的说法吗?还有你说上面的那个程序不会出来,你那个while的条件是什么,你都没吧,如果是死循环那当然不会出来了。 参考技术B 博客园去啊

以上是关于java里多线程的wait问题的主要内容,如果未能解决你的问题,请参考以下文章

JAVA多线程之wait/notify

Java多线程——wait方法和notify方法的详解

Java多线程之线程通信

[多线程]wait和notify

Java多线程8:wait()和notify()/notifyAll()

Java多线程8:wait()和notify()/notifyAll()