在Java中,synchronized和ReentrantLock都是可重入锁,所以在线程上的加锁和解锁会做限制,加锁和解锁必须在同一线程,并且成对出现。如果你想在不同的线程上加锁和解锁,你需要使用Condition。Condition是一个与Lock绑定的对象,它可以让你在不同的线程上等待和唤醒。例如:
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
// 线程1
lock.lock();
try {
// do something
condition.signal();
} finally {
lock.unlock();
}
// 线程2
lock.lock();
try {
condition.await();
// do something
} finally {
lock.unlock();
}
这样,线程1就可以在不同的线程上解锁,而线程2则可以在不同的线程上等待和唤醒。