新手 Java 多线程 .wait(); 函数前面的对象 要填什么

.wait() 的作用是 让当前线程进入等待状态,同时释放当前线程所持有的锁。
那 .wait前面的对象要填什么

图片说明

.wait() 的作用是 让当前线程进入等待状态,同时释放当前线程所持有的锁。
那 .wait前面的对象要填什么

0

4个回答

一般来说,synchronized谁就wait()谁。synchronized拿到对象锁,执行过程中发现条件不成熟,于是wait()把拿到的对象锁放下,继续等待。给其他线程机会。

0
liuade
艾德 回复weixin_41423378: 是的,另外有个best practise,一般使用wait(long timeout),不直接用wait()。睡一会起来看一下执行条件成熟了没,没成熟可以接着睡,防止一直死等。
11 个月之前 回复
weixin_41423378
银翼的魔术师s 如果A线程调用了 obj.wait() ,是不是要 B(其他)线程调用 obj.notify() 才能醒来
11 个月之前 回复
liuade
艾德 回复weixin_41423378: 那个prev.wait()的位置已经在self的synchronized块外面了,当前线程只有prev的锁了。当然,更主要是看你的业务逻辑。记住wait只能在synchronized块里用,synchronized了谁,就wait谁。你多理解一下就明白了
11 个月之前 回复
weixin_41423378
银翼的魔术师s 是不是 synchronized 代码段执行完 锁会自己释放,不用wait也会释放 锁 ? 之所以使用wait是为了使该线程 阻塞
11 个月之前 回复
weixin_41423378
银翼的魔术师s 回复liuade: 为什么只拿到了prev的锁 不是还有一句 synchronized(self)吗
11 个月之前 回复
liuade
艾德 回复weixin_41423378: 从代码上看,那个位置只能是prev.wait(),因为wait()会释放拿到的锁,那个位置当前线程synchronized(prev)只拿到了prev的锁。
11 个月之前 回复
weixin_41423378
银翼的魔术师s 有两个synchronized 拿了 prev和slef 两个对象锁,为什么下面只有一个wait ,又为什么是prev的wait
11 个月之前 回复

wait前面应该是线程。但是你是字符串变量,感觉你需要的不是wait,而是lock (用了synchronized,不需要再lock,其它线程访问prev等变量,如果有线程锁定,会自动等待)

https://blog.csdn.net/superjunenaruto/article/details/58315357

0
weixin_41423378
银翼的魔术师s 是不是 synchronized 代码段执行完 锁会自己释放,不用wait也会释放 锁 ? 之所以使用wait是为了使该线程 阻塞
11 个月之前 回复

你这个例子我感觉会出现线程B和C死等的情况

0

wait可以用Object对象
Object对象用于通知处在等待该对象的线程的方法
so,你可以这样理解,设定Object a,b,c用来同步代码块

上面不好理解,下面用本例说明
每一个MyThThread线程中定义两个Object对象,前一个作用为锁定自己的代码块,后一个用于解锁别的线程的代码块。
main中
A线程开启,c锁自己,开a
B线程开启,a锁自己,被A线程开启,开b
C线程开启,b锁自己,被B线程开启,开c
A线程开启,循环

可以做到十次ABC循环
但是有个问题
最后一次的C线程wait之后没人开,会一直等待
建议设一个条件判断是最后一次时不走等待;

0
weixin_41423378
银翼的魔术师s 是不是 synchronized 代码段执行完 锁会自己释放,不用wait也会释放 锁 ? 之所以使用wait是为了使该线程 阻塞
11 个月之前 回复
weixin_41423378
银翼的魔术师s 有两个synchronized 拿了 prev和slef 两个对象锁,为什么下面只有一个wait ,又为什么是prev的wait
11 个月之前 回复
a1398357432
范一凡 B也会死等
11 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!