在sychronized中咱们可使用wait(),notify()来让线程等待、唤醒;在ReentrantLock中咱们能够用Condition中的await(),signal()来实现;ide
public class LockCondition { private static ReentrantLock lock=new ReentrantLock(); private static Condition condition=lock.newCondition(); public static void main(String[] args) { Thread t1=new Thread(new task1(),"task1"); Thread t2=new Thread(new task2(),"task2"); t1.start();t2.start(); try { t1.join(); t2.join(); } catch (InterruptedException e) { e.printStackTrace(); } } public static class task1 implements Runnable{ @Override public void run() { lock.lock(); System.out.println(Thread.currentThread().getName()+"开始执行"); System.out.println(Thread.currentThread().getName()+"释放锁并等待"); try { condition.await(); System.out.println(Thread.currentThread().getName()+"从新获取到锁"); System.out.println(Thread.currentThread().getName()+"执行完成"); } catch (InterruptedException e) { e.printStackTrace(); }finally { lock.unlock(); } } } public static class task2 implements Runnable{ @Override public void run() { lock.lock(); System.out.println(Thread.currentThread().getName()+"开始执行"); System.out.println(Thread.currentThread().getName()+"开始唤醒其余线程"); condition.signal(); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"执行完成"); lock.unlock(); } } } 执行结果以下: task1开始执行 task1释放锁并等待 task2开始执行 task2开始唤醒其余线程 task2执行完成 task1从新获取到锁 task1执行完成
解析:task1执行到await()时会释放lock,task2获取到锁,在task2中唤醒task1,但此时lock仍是被task2占据,故会等到task2执行完成task1才会拿到lock再继续执行线程