您的位置:首页 > 大数据 > 人工智能

为什么wait()和notify()必须要使用sychronized

2016-10-29 11:41 246 查看

为什么wait()和notify()必须要使用sychronized

如果不用就会报错IllegalMonitorStateException.

首先要明确,wait()和notify()的实现基础是基于对象存在的。那为什么要基于对象存在呢?

这里要明确要等,等待的就是一个对象发出的信号,所以要基于对象而存在。

既然是基于对象的,因此它不得不用一个数据结构来存放这些等待的线程,而且这个数据结构应当是与该对象绑定的,此时在这个对象上可能同时有多个线程调用wait()/notify()方法。

在向这个对象所对应的双向链表中写入、删除数据时,依然存在并发的问题,理论上也需要一个锁来控制。在JVM内核源码中并没有发现任何自己用锁来控制写入的动作,只是通过检查当前线程是否为对象的OWNER来判定是否要抛出相应的异常。由此可见它希望该动作由Java程序这个抽象层次来控制,它为什么不想去自己控制锁呢?

因为有时候更低层抽象层次的锁未必是好事,因为这样的请求对于外部可能是反复循环地去征用,或者这些代码还可能在其他地方复用,也许将它粗粒度化会更好一些,而且这样的代码写在Java程序中本身也会更加清晰,更加容易看到相互之间的关系。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线程