我有以下代码,它们在可重入锁中执行数据库调用。此代码由线程池(ExecutorService)执行。据我所知,这种情况是阻塞的I / O操作。但是我对线程状态执行数据库调用并返回结果时感到困惑。有人说它处于阻塞状态,有人说它处于监视器的等待状态(但是我认为线程在处于等待状态时会释放监视器)。需要对此进行澄清。
@Override
public void run() {
lock.lock();
try {
// DB call
} finally {
lock.unlock();
}
}
答案 0 :(得分:1)
但是我听说转移到等待池的线程会释放它获取的锁。那么它在这种情况下如何适用?
我认为这是“不”。 lock
的锁定状态不应受其他对象监视器的状态影响。 lock
上的锁定应保持到例程完全执行为止,即使其线程被阻塞并在IO上等待,lock
仍将被锁定并阻塞所有其他线程,直到其完成并释放锁为止。
这里的区别是您没有等待lock
。 lock.wait()
会释放锁定,但是您的例程实际上会阻塞(和wait
)在其他IO对象上,因此lock
不会受到影响。
答案 1 :(得分:0)
答案 2 :(得分:-1)
...有人说它处于监视器的等待状态(但是我认为线程在等待状态时会释放监视器)
您正在混淆监视器和锁。
参见What's a monitor in Java?
每个Java对象都有一个监视器。在对象上进行同步时,监视器被“锁定”,并且当您存在同步作用域或在对象上wait()
时,将释放该锁定。