重入锁的好搭档Condition

2023-12-20 00:08:12
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,但是由于它无非重新获得锁。
因而也就无法真正的继续执行。

文章来源:https://blog.csdn.net/wcg_jishuo/article/details/135096098
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。