ReentrantLock中Condition的使用记录

在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再继续执行线程

相关文章
相关标签/搜索