阻塞I / O操作的线程状态是什么

时间:2019-05-06 15:07:53

标签: java multithreading

我有以下代码,它们在可重入锁中执行数据库调用。此代码由线程池(ExecutorService)执行。据我所知,这种情况是阻塞的I / O操作。但是我对线程状态执行数据库调用并返回结果时感到困惑。有人说它处于阻塞状态,有人说它处于监视器的等待状态(但是我认为线程在处于等待状态时会释放监视器)。需要对此进行澄清。

@Override
public void run() {
    lock.lock();
    try {
       // DB call
    } finally {
        lock.unlock();
    }
}

3 个答案:

答案 0 :(得分:1)

  

但是我听说转移到等待池的线程会释放它获取的锁。那么它在这种情况下如何适用?

我认为这是“不”。 lock的锁定状态不应受其他对象监视器的状态影响。 lock上的锁定应保持到例程完全执行为止,即使其线程被阻塞并在IO上等待,lock仍将被锁定并阻塞所有其他线程,直到其完成并释放锁为止。

这里的区别是您没有等待locklock.wait()会释放锁定,但是您的例程实际上会阻塞(和wait)在其他IO对象上,因此lock不会受到影响。

答案 1 :(得分:0)

  • 阻塞状态是在等待监视器锁定时。

  • 等待另一个线程。


因为这里线程正在等待数据库请求响应,所以它正在等待而不是被阻止。

查看有关Java here中线程状态的详细信息。

答案 2 :(得分:-1)

  

...有人说它处于监视器的等待状态(但是我认为线程在等待状态时会释放监视器)

您正在混淆监视器
参见What's a monitor in Java?

每个Java对象都有一个监视器。在对象上进行同步时,监视器被“锁定”,并且当您存在同步作用域或在对象上wait()时,将释放该锁定。

Lock是一种完全不同的机制,您可以显式调用lock()unlock()