java里 对线程的wait方法只有在synchronized下才有用吗?
1个回答
展开全部
不是,可以不用synchronized,但Java推荐在调用wait方法前将对象锁住
其实,从并发的角度考虑,wait是不能放在synchronized锁里的,会引起死锁。
试考虑,当wait和notify方法都在synchronized锁里的时候,调用wait方法前将对象锁住,然后调用wait方法,线程被挂起,需要其它线程调用notify将其唤醒。
由于notify方法也在synchronized里面,其它线程调用notify的时候要获得对象的锁,但此时锁已经被wait所在的线程持有,而且wait线程已经被挂起,所以notify因为无法获得锁而挂起,这样二者相互等待,导致死锁。
Java里面可以将wait和notify放在synchronized里面,是因为Java是这样处理的:
在synchronized代码被执行期间,线程调用对象的wait()方法,会释放对象锁标志,然后进入等待状态,然后由其它线程调用notify()或者notifyAll()方法通知正在等待的线程。
其实,从并发的角度考虑,wait是不能放在synchronized锁里的,会引起死锁。
试考虑,当wait和notify方法都在synchronized锁里的时候,调用wait方法前将对象锁住,然后调用wait方法,线程被挂起,需要其它线程调用notify将其唤醒。
由于notify方法也在synchronized里面,其它线程调用notify的时候要获得对象的锁,但此时锁已经被wait所在的线程持有,而且wait线程已经被挂起,所以notify因为无法获得锁而挂起,这样二者相互等待,导致死锁。
Java里面可以将wait和notify放在synchronized里面,是因为Java是这样处理的:
在synchronized代码被执行期间,线程调用对象的wait()方法,会释放对象锁标志,然后进入等待状态,然后由其它线程调用notify()或者notifyAll()方法通知正在等待的线程。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询