notifyall必须要放在synchronized里面吗 rt 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 调用notifyAll方法的线程,必须已取得调用该方法的对象的内部锁,或者叫监视器。你可以这样理解:首先,synchronized块内要被同步访问的对象应该被设计为只被持有该内部锁的线程访问,否则任何一个线程都可以在非同步区域里改变对象的值的话,同步就没意义了。在synchronized块内wait的线程,一定在等待这里的某些对象达到某种条件。而不持有锁的线程,触及不到这些对象,无法创造使得wait的线程继续运行的条件,所以它没有资格去唤醒等待的线程。这样说你理解了吗? notifyAll/notify必须要放在synchronized里面!并且和wait是成对出现的! 并且和wait是成对出现的!?? 对,只有拥有对象锁的对象才能使用notify/notifyAll方法。怎么才能拥有对象锁?只有synchronized! 我是否可以在Synchronized中用if else写两个notifyAll? 不是成对出现,我认为是对应出现。1) Object obj = new Object();2) obj.wait();3) obj.notify();4) obj.notifyAll();调用了2)wait方法后,当前线程处于等待(暂停)状态。程序中应该有其他的线程,调用对应的3)4),以便在让运行2)的线程继续。 notifiyAll必须在synchronized里面。在synchronized的里面,当前线程已经获得某个对象内部锁,调用notifyAll时,会释放内部锁。如果notifyAll放在外部,当前线程已经释放了内部锁,就没法实现释放。 [Quote=引用 6 楼 weiluo12 的回复:]引用 4 楼 jinxfei 的回复:并且和wait是成对出现的! ?? 如果不是,请高手解释![/Quote语法没有这样的规定,看你的程序吧 虽然揭帖,但我认为还是不用必须怎么样的。notify,根本不需要同步,他只是发出信号告诉大家可以来拿了,就算来了,没有找到东西也没什么。 你这个notify是释放锁的。如果都没有进入synchronized,没有获得锁,何来的释放,然后通知调度器调度别的线程,实际上notify不在synchronized中,是会抛java.lang.IllegalMonitorStateException的。 Iterator 怎么 转换成LIST 正则如何判断 在线求:能不能在 一个类里面写一个方法,这个方法,每隔一段事件(时间可设定)自动访问数据库,并将数据读出来? System.in,System.out,System.err既然是final static的,为什么还有setIn(),setOut(),setErr()呢? 有人能给我解释一下这个程序吗? 中文分词歧义处理 本来想让一个球移动,怎么变成一条直线了 如何实现server监听多个客户机的连接请求 [急,高分咨询]如何带参数登陆到asp的页面进去取信息? Eclipse 关于打成jar包的问题 这是什么错误?
你可以这样理解:首先,synchronized块内要被同步访问的对象应该被设计为只被持有该内部锁的线程访问,否则任何一个线程都可以在非同步区域里改变对象的值的话,同步就没意义了。在synchronized块内wait的线程,一定在等待这里的某些对象达到某种条件。而不持有锁的线程,触及不到这些对象,无法创造使得wait的线程继续运行的条件,所以它没有资格去唤醒等待的线程。这样说你理解了吗?
并且和wait是成对出现的!
怎么才能拥有对象锁?只有synchronized!
我是否可以在Synchronized中用if else写两个notifyAll?
1) Object obj = new Object();
2) obj.wait();
3) obj.notify();
4) obj.notifyAll();调用了2)wait方法后,当前线程处于等待(暂停)状态。程序中应该有其他的线程,调用对应的3)4),以便在让运行2)的线程继续。
引用 4 楼 jinxfei 的回复:
并且和wait是成对出现的! ??
如果不是,请高手解释!
[/Quote
语法没有这样的规定,看你的程序吧
你这个notify是释放锁的。如果都没有进入synchronized,没有获得锁,何来的释放,然后通知调度器调度别的线程,实际上notify不在synchronized中,是会抛java.lang.IllegalMonitorStateException的。