我们常用的线程加锁方式synchronized(Object), 他的wait方法会释放锁,也就是当调用 当前线程的wait方式时,别的线程可以获取该锁,sleep()方法不会释放锁,别的线程只能等待该线程释放锁。 与此相类似的还有ReentrantLock, 该对象的调用await()分三步, 1.先获取Condition 对象 private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition();
2. 先要获取监视器(即调用lock方法) lock.lock();
3. 调用await() 方法 condition.await();
最重要的是该方法会释放锁,也就是会释锁(监视器)给别的线程
public class ReentLock {
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
private void lockTest() throws InterruptedException {
lock.lock();
System.out.println("等待"+Thread.currentThread().getName());
condition.await();
System.out.println("结束");
lock.unlock();
}
private void lockTest1() throws InterruptedException{
lock.lock();
Thread.sleep(1000);
System.out.println("唤醒"+ Thread.currentThread().getName());
condition.signalAll();
lock.unlock();
}
public static void main(String[] args){
ReentLock reentLock = new ReentLock();
new Thread(()->{
try {
reentLock.lockTest();
}catch (InterruptedException e){
e.printStackTrace();
}
},"A").start();
new Thread(()->{
try {
reentLock.lockTest1();
}catch (InterruptedException e){
e.printStackTrace();
}
},"B").start();
}
}
也就是说A线程启动了,调用了 condition的await()方法,线程B就可以调用lock的lock()方法。