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

来源:互联网 发布:残疾人就业知乎 编辑:程序博客网 时间:2024/03/28 18:47

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

如果不用就会报错IllegalMonitorStateException.

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

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

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

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

因为有时候更低层抽象层次的锁未必是好事,因为这样的请求对于外部可能是反复循环地去征用,或者这些代码还可能在其他地方复用,也许将它粗粒度化会更好一些,而且这样的代码写在Java程序中本身也会更加清晰,更加容易看到相互之间的关系。

0 0