13 java multithreading illegalmonitorstateexcep notify
什么可能导致我在此代码中得到IllegalMonitorStateException
synchronized(syncCount){
syncCount--;
syncCount.notify();
}
Run Code Online (Sandbox Code Playgroud)
我有点困惑,因为据我所知,运行线程必须在对象上监视通知被调用.在我看来,我的代码不会出错,但不知何故.
Tom*_*ine 23
类型Integer或类似?用另一个--替换不可变Integer对象.因此,你正在调用notify一个不同的对象synchronized.
您的代码相当于:
Integer syncConunt = Integer.valueOf(5);
[...]
synchronized (syncCount) {
syncCount = Integer.valueOf(syncCount.intValue() + 1);
syncCount.notify();
}
Run Code Online (Sandbox Code Playgroud)
你不是一个人.甚至在J2SE 5.0之前,我已经看到在一本书中发布的示例代码,该书在同步块中分配了一个引用.通常,标记锁定字段是个好主意final.
另一个重要的一点是代码在它不"拥有"的对象上进行同步.Integer对象是共享的(Integer.valueOf(int)如果使用介于-128和127之间的值调用,则返回完全相同的实例,并且可能更进一步).如果这是由两段不相关的代码完成的,那么就会隐藏相互作用.这适用于在不相关代码之间共享实例的任何类型.常见的例子是Integer,String,Class(通过静态同步方法使用)和Thread(在Sun的实现,Thread恰好被用作锁join).
| 归档时间: |
|
| 查看次数: |
973 次 |
| 最近记录: |