常用的并发编程技巧:
(1)永远在synchronized的方法或对象里使用wait、notify和notifyAll,不然虚拟机会生成 IllegalMonitorStateException。
第一个问题比较容易发现,往往在单测就可以暴露出问题。
(2)始终使用while循环来调用wait方法(而非if),永远不要在循环外调用wait方法。这样做的原因是尽管并不满足被唤醒条件,但是由于其他线程调用notifyAll()方法会导致被阻塞线程意外唤醒,此时执行条件并不满足,他将破坏被锁保护的约定关系,导致约束失效,引起意想不到的结果。
第二个问题需要切记,这个问题往往会出现在刚接触并发编程的开发者身上。
标准的使用方式
synchronized(this){ while(condition){ this.wait(); } }
(3)唤醒线程,应该使用notify还是notifyAll?当你不知道究竟该调用哪个方法时,保守的做法是调用notifyAll唤醒所有等待的线程。从优化的角度看,如果处于等待的所有线程都在等待同一个条件,而每次只有一个线程可以从这个条件中被唤醒,那么就应该选择调用notify。
网友评论