单线程通信
- wait & notify
wait()和notify()都是Object的方法。wait方法会使当前线程进入阻塞,知道有其它线程调用了notify()或notifyAll(),或者阻塞时间到了。
wait(),notify必须拥有该对象的monitor(This monitor),也就是wait方法只能在同步方法中使用,并且wait和notify的对象一致。否则会抛出IllegalMonitorStateException。
线程执行了某个对象的wait方法之后,会加入对应的wait set,每个对象的monitor都有一个与之对应的wait set。线程进入wait set之后,notify方法将其唤醒,也就是从wait set中弹出,同时中断wait中的线程也会将其唤醒。
多线程通信
- notifyAll
和notify相似,都是它会唤醒所有阻塞的线程,然后唤醒的线程继续枪monitor的锁。
- 共享的数据结构,如ConcorrectHashMap,AtomInteger。
- 构造自己的lock。
public interface Lock {
void lock();
void lockInterruptibly() throws InterruptedException;
boolean tryLock();
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
void unlock();
Condition newCondition();
}
可以参考:http://ifeve.com/customizing-concurrency-classes-9/