Java的JDK1.50及之后的版本中做了升级,用Lock 替代了synchronized 方法和语句的使用,Condition 替代了Object 监视器方法(wait、notify和notifyAll)的使用。Lock的原理其实和synchronized是一样的。
java的每个对象都有一个监视器(也就是锁),只能被同一线程拥有(即同一线程可重入),一旦被一个线程获取,那其它线程只能等待。synchronized(obj)意思就是获得obj的监视器,对应于monitorenter,代码块结束时自动释放,相当于monitorexit。
只有获得了对象的监视器,才能执行监视器方法,也就是wait、notify或notifyAll。也就是只有synchronized(this)后才能this.wait或this.notify,不能获得一个对象的监视器而执行另一个对象的监视器方法。
在condictin上await后必须有线程调用condition.signal()。你可以在你的线程上提供2个方法:
class RunA implements Runable {
public void wait1() {
lock.lock();
try {
condition.await();
}finally{
lock.unlock();
}
}
public void continue1() {
lock.lock();
try {
condition.signal();
} finally {
lock.unlock();
}
}
}
本线程调用wait1,另一线程调用continue1通知继续,这跟在Object上的wait与notify是一回事 |
|