Archives

帖子来自 xiaoxiaosunzhao RSS

多线程 (wait)

作者: xiaoxiaosunzhao (1 篇文章) 日期: 八月 3, 2011 在 5:57 下午
评论 (0)

  1. 如果线程1获取锁A和B后,调用B.wait, 这时 线程1只是释放了锁B,仍然持有锁A(已验证) 所以,obj.wait调用注意的两点是: 1. 当前线程已经持有obj的锁, 即需要先synchronized(obj),不然可能造成不能唤醒当前线程, 因为:obj.wait后,当前线程进入obj的monitor的等待队列(一个线程最多在一个monitor的等待队列中) 2. obj.wait仅仅是是否当前线程对obj的monitor的持有,如果当前线程持有其他对象的monitor, 那么不会释放其他对象的monitor的(也无法做到,因为一旦wait了就无法再向下执行代码了) ps:notify也是针对调用方法的对象的monitor的 2. 如果有线程在A对象上的monitor进行wait,那么所有剩余其他线程取得A对象的monitor后,在释放A的monitor之前(例如:synchronized后一个大括号之前), 都在A的monitor上调用notifyAll(保险的办法是:取得monitor后都立即调用该对象的notifyAll,让monitor的等待队列中的线程都变成阻塞队列中的线程(忙等待)) 3. 如果所有线程都在A对象的monitor没有wait,那么要么处于执行,要忙等待(阻塞),是不需要notify来唤醒的。 4. 获取对象的monitor的期间,最好只进行原子操作,例如,从队列中取得队列的一个元素,取得队列元素总数等待,不能进行耗时操作(网络接口调用或者大量代码的执行) 也就是仅仅对 操作[需要同步的对象(比如下载任务队列)]的代码才应该放在取得monitor的期间执行,即:这些代码应该都是操作同步对象的,否则很可能是多余的。

继续 ›

分类: 博客征文专栏, 并行计算