如果线程没有失去任何监视器的所有权,是否会导致其他 运行 线程阻塞
if thread does not lose ownership of any monitors, could it lead other running thread blocked
在 Thread.sleep()
JavaDoc 中,它指出:
Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers. The thread does not lose ownership of any monitors.
我的问题是:如果线程 A 持有监视器并进入休眠状态,那么线程调度程序将选择另一个 运行 启用线程 B 并 运行 它。但是如果线程B需要那个监视器,那么它就会被阻塞,其他任何依赖于监视器的线程都会被阻塞,直到线程A从睡眠中恢复并到达运行并释放那个监视器,是不是很低效
是的。
您还期待其他什么答案?
如果你拿着显示器,显然不要睡觉。而是使用等待和通知。
下面是当您使用 wait 时会发生什么,您可以调用一个对象,如果您想要使用它,您 拥有 来保持监视器:
synchronized (foo) {
do stuff()
foo.wait();
do more stuff();
}
当调用 wait() 时,首先,线程 释放 监视器。接下来,它只会转动拇指并等待某人、任何人对同一引用 (foo.notify()
) 调用 notify()
。那时,wait()
方法被释放,但仍会等待,因为它现在需要在继续之前重新获取该监视器。这不一定会立即发生,因为除非您按住显示器,否则无法调用 notify()
。
这很好地解决了您的问题:您可以让一个线程在释放该监视器的同时休眠(但它不会释放其他监视器)。
更一般地说,使用这些低级 API 几乎从来都不是正确的举动。有一些抽象,主要在 java.util.concurrent
包中,它们要好得多。您应该打开 javadoc 并仔细阅读。
在 Thread.sleep()
JavaDoc 中,它指出:
Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers. The thread does not lose ownership of any monitors.
我的问题是:如果线程 A 持有监视器并进入休眠状态,那么线程调度程序将选择另一个 运行 启用线程 B 并 运行 它。但是如果线程B需要那个监视器,那么它就会被阻塞,其他任何依赖于监视器的线程都会被阻塞,直到线程A从睡眠中恢复并到达运行并释放那个监视器,是不是很低效
是的。
您还期待其他什么答案?
如果你拿着显示器,显然不要睡觉。而是使用等待和通知。
下面是当您使用 wait 时会发生什么,您可以调用一个对象,如果您想要使用它,您 拥有 来保持监视器:
synchronized (foo) {
do stuff()
foo.wait();
do more stuff();
}
当调用 wait() 时,首先,线程 释放 监视器。接下来,它只会转动拇指并等待某人、任何人对同一引用 (foo.notify()
) 调用 notify()
。那时,wait()
方法被释放,但仍会等待,因为它现在需要在继续之前重新获取该监视器。这不一定会立即发生,因为除非您按住显示器,否则无法调用 notify()
。
这很好地解决了您的问题:您可以让一个线程在释放该监视器的同时休眠(但它不会释放其他监视器)。
更一般地说,使用这些低级 API 几乎从来都不是正确的举动。有一些抽象,主要在 java.util.concurrent
包中,它们要好得多。您应该打开 javadoc 并仔细阅读。