关于synchronized(obj)的讨论
来源:互联网 发布:微软office mac版免费 编辑:程序博客网 时间:2024/05/16 21:05
通常,多线程之间需要协调工作。例如,浏览器的一个显示图片的线程displayThread想要执行显示图片的任务,必须等待下载线程downloadThread将该图片下载完毕。如果图片还没有下载完,displayThread可以暂停,当downloadThread完成了任务后,再通知displayThread“图片准备完毕,可以显示了”,这时,displayThread继续执行。
以上逻辑简单的说就是:如果条件不满足,则等待。当条件满足时,等待该条件的线程将被唤醒。在Java中,这个机制的实现依赖于waittify。等待机制与锁机制是密切关联的。例如:
synchronized(obj) {
while(!condition) {
obj.wait();
}
obj.doSomething();
}
当线程A获得了obj锁后,发现条件condition不满足,无法继续下一处理,于是线程A就wait()。
在另一线程B中,如果B更改了某些条件,使得线程A的condition条件满足了,就可以唤醒线程A:
synchronized(obj) {
condition = true;
obj.notify();
}
需要注意的概念是:
# 调用obj的wait(), notify()方法前,必须获得obj锁,也就是必须写在synchronized(obj) {...} 代码段内。
# 调用obj.wait()后,线程A就释放了obj的锁,否则线程B无法获得obj锁,也就无法在synchronized(obj) {...} 代码段内唤醒A。
# 当obj.wait()方法返回后,线程A需要再次获得obj锁,才能继续执行。
# 如果A1,A2,A3都在obj.wait(),则B调用obj.notify()只能唤醒A1,A2,A3中的一个(具体哪一个由JVM决定)。
# obj.notifyAll()则能全部唤醒A1,A2,A3,但是要继续执行obj.wait()的下一条语句,必须获得obj锁,因此,A1,A2,A3只有一个有机会获得锁继续执行,例如A1,其余的需要等待A1释放obj锁之后才能继续执行。
# 当B调用obj.notifytifyAll的时候,B正持有obj锁,因此,A1,A2,A3虽被唤醒,但是仍无法获得obj锁。直到B退出synchronized块,释放obj锁后,A1,A2,A3中的一个才有机会获得锁继续执行。
- 关于synchronized(obj)的讨论
- 关于synchronized(obj)的讨论
- 关于[同步]的讨论--synchronized
- 关于synchronized(obj)
- synchronized(obj)
- java synchronized的用法讨论
- Java synchronized参数的讨论
- synchronized方法和同步块的作用范围;synchronized(this)和synchronized(obj)的区别
- 线程-synchronized方法和同步块的作用范围;synchronized(this)和synchronized(obj)的区别
- 线程-synchronized方法和同步块的作用范围;synchronized(this)和synchronized(obj)的区别
- javaFX使用synchronized(obj)导致的一个异常
- 关于checkpoint的讨论
- 关于checkpoint的讨论
- 关于比赛的讨论
- 关于工作流的讨论
- 关于C的讨论
- 关于时钟的讨论
- 关于单元测试的讨论
- 芦荟 仙人掌
- 实现在线翻译js文件
- 单臂路由显身手
- 五类双绞线原理
- 个人常用网站收藏
- 关于synchronized(obj)的讨论
- 庆祝火箭队进去季后赛第二轮!
- QT+eclipse
- 未来5年虚拟现实将成为最伟大的技术
- 基于mkCDrec的linux服务器数据库应用软件的备份与恢复
- linux-2.6内核升级文档
- vc 简单播放声音
- 设计模式--抽象工厂(AbstractFactory)
- Windows进程小结