一尘不染

混合synced()与ReentrantLock.lock()

java

在Java中,这样做ReentrantLock.lock()ReetrantLock.unlock()使用相同的锁定机制synchronized()

我的猜测是“不”,但我希望是错的。

例:

想象一下,线程1和线程2都可以访问:

ReentrantLock lock = new ReentrantLock();

线程1运行:

synchronized (lock) {
    // blah
}

线程2运行:

lock.lock();
try {
    // blah
}
finally {
    lock.unlock();
}

假设线程1首先到达其部分,然后在线程1完成之前到达线程2:线程2将等待线程1离开该synchronized()块,还是继续运行?


阅读 256

收藏
2020-12-03

共1个答案

一尘不染

不,lock()即使线程1
synchronized在同一线程上,线程2也可以lock。这是文档必须说的:

请注意,Lock实例只是普通对象,它们本身可以用作同步语句中的目标。获取Lock实例的监视器锁与调用该实例的任何lock()方法没有指定的关系。建议避免混淆,除非在自己的实现中使用,否则不要以这种方式使用Lock实例。

2020-12-03