重入锁的好搭档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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!