重入锁的好搭档Condition

public class ReenterLockCondition implements  Runnable{
    public static ReentrantLock lock = new ReentrantLock();
    public static Condition condition = lock.newCondition();
    @Override
    public void run() {
        try {
            lock.lock();
            condition.await();
            System.out.println("Thread is going on");
        } catch (InterruptedException e){
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

}
public static void main(String[] args) {
        ReenterLockCondition reenterLockCondition = new ReenterLockCondition();
        Thread t1 = new Thread(reenterLockCondition);
        t1.start();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        lock.lock();
        condition.signal();
        //birulock.unlock();
        System.out.println("Hello world!");
    }

与Object.wait()方法和notify()方法一样,当线程使用condition.await()方法时,
要求线程持有相关的重入锁,在condition.await()方法调用后,这个线程会释放这把锁。
同理,在condition.signal()方法调用时,也要求线程先获得相关的锁。
在singal()方法调用后,系统会从当前condition对象的等待队列中唤醒一个线程。
一旦线程被唤醒,它会重新尝试获得与之绑定的重入锁,一旦成功获取,就可以继续执行了。
因此,在singal()方法调用之后,一般需要释放相关的锁,让给被唤醒的线程,让它可以继续执行。
比如在 lock.unlock();代码就是释放了重入锁,如果省略,那么虽然已经唤醒了线程t1,但是由于它无非重新获得锁。
因而也就无法真正的继续执行。

重入锁的好搭档Condition_第1张图片

你可能感兴趣的:(java,jvm,开发语言)