为什么wait()和notify()必须要使用sychronized
2016-10-29 11:41
246 查看
为什么wait()和notify()必须要使用sychronized
如果不用就会报错IllegalMonitorStateException.首先要明确,wait()和notify()的实现基础是基于对象存在的。那为什么要基于对象存在呢?
这里要明确要等,等待的就是一个对象发出的信号,所以要基于对象而存在。既然是基于对象的,因此它不得不用一个数据结构来存放这些等待的线程,而且这个数据结构应当是与该对象绑定的,此时在这个对象上可能同时有多个线程调用wait()/notify()方法。
在向这个对象所对应的双向链表中写入、删除数据时,依然存在并发的问题,理论上也需要一个锁来控制。在JVM内核源码中并没有发现任何自己用锁来控制写入的动作,只是通过检查当前线程是否为对象的OWNER来判定是否要抛出相应的异常。由此可见它希望该动作由Java程序这个抽象层次来控制,它为什么不想去自己控制锁呢?
因为有时候更低层抽象层次的锁未必是好事,因为这样的请求对于外部可能是反复循环地去征用,或者这些代码还可能在其他地方复用,也许将它粗粒度化会更好一些,而且这样的代码写在Java程序中本身也会更加清晰,更加容易看到相互之间的关系。
相关文章推荐
- 为什么 java wait/notify 必须与 synchronized 一起使用,jvm究竟做了些什么
- 为什么wait(),notify()和notifyAll()必须在同步块或同步方法中调
- 为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?
- 为什么wait与notify之前必须要加synchronized?
- java 为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?
- 为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?
- 为什么wait()和notify()需要搭配synchonized关键字使用
- 为什么Object.wait(),Object.notify(),Object.notifyAll()必须在同步块中执行呢?
- (转)为什么wait(),notify()和notifyAll()必须在同步块或同步方法中调用
- [转]java 为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?
- java 为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?
- Java 为什么使用wait()/notify()机制?
- java 为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?
- 关于使用spring的动态代理机制时为什么必须指定接口
- 拷贝构造函数的参数为什么必须使用引用类型
- 为什么必须要使用CloseHandle关闭句柄
- Java:使用wait()与notify()实现线程间协作
- 线程同步(使用了synchronized)和线程通讯(使用了wait,notify)
- 拷贝构造函数的参数为什么必须使用引用类型.
- 线程同步(使用了synchronized)和线程通讯(使用了wait,notify)