在Java中,当当前线程在sleep()上被调用但仍然持有锁时,其他线程如何获得运行的机会?
在Java中,一个线程可以进入睡眠状态,这样它就不会占用进程,而其他线程就有机会运行。这是通过调用sleep()完成的在Java中,当当前线程在sleep()上被调用但仍然持有锁时,其他线程如何获得运行的机会?,java,multithreading,concurrency,sleep,Java,Multithreading,Concurrency,Sleep,在Java中,一个线程可以进入睡眠状态,这样它就不会占用进程,而其他线程就有机会运行。这是通过调用sleep()完成的 但是,与调用wait()不同的是,在调用sleep()之后,线程不会释放它一直持有的锁。既然这个线程仍然持有锁,那么其他线程如何在无法获得未释放的锁的情况下有机会运行呢?他们不能;其他需要获取休眠线程持有的锁的线程将阻塞,直到它们能够获得它为止。没有办法像tryacquire那样退出显式锁,因此线程被卡住了 线程不应该在持有锁时休眠。如果一个线程没有做一些有用的事情,它不需要持
但是,与调用wait()不同的是,在调用sleep()之后,线程不会释放它一直持有的锁。既然这个线程仍然持有锁,那么其他线程如何在无法获得未释放的锁的情况下有机会运行呢?他们不能;其他需要获取休眠线程持有的锁的线程将阻塞,直到它们能够获得它为止。没有办法像tryacquire那样退出显式锁,因此线程被卡住了 线程不应该在持有锁时休眠。如果一个线程没有做一些有用的事情,它不需要持有锁
要进入休眠状态并释放锁,请使用wait方法。除了中断(应该用于取消)之外,Sleep没有任何方法缩短它的睡眠时间,wait让线程得到通知 他们不能;其他需要获取休眠线程持有的锁的线程将阻塞,直到它们能够获得它为止。没有办法像tryacquire那样退出显式锁,因此线程被卡住了 线程不应该在持有锁时休眠。如果一个线程没有做一些有用的事情,它不需要持有锁
要进入休眠状态并释放锁,请使用wait方法。除了中断(应该用于取消)之外,Sleep没有任何方法缩短它的睡眠时间,wait让线程得到通知 如果在持有锁时调用
Thread.sleep()
,或者从synchronized
块/方法内部调用Thread.sleep()
,则到达该锁的任何其他线程都将等待,直到第一个线程恢复并释放锁
但是锁/同步不是全局的,任何未达到休眠线程持有的锁的线程都可以毫无问题地运行。如果在持有锁时调用
thread.sleep()
,或者从synchronized
块/方法内部调用,到达该锁的任何其他线程都将等待第一个线程恢复并释放锁
然而,锁/同步不是全局的,任何没有达到休眠线程持有的锁的线程都可以毫无问题地运行
如果其他线程无法在该线程将要休眠时运行锁,那么该线程首先休眠的目的是什么
唯一能回答这个问题的人是编写线程中运行的代码的人
是你吗
正如Nathan Hughes所说,当线程持有互斥锁时,sleep()
实际上从来都不是一个好主意。更进一步地说,线程在保持互斥锁的同时执行任何超过一微秒的操作几乎都不是一个好主意。如果您发现自己编写的代码在锁定锁的同时等待某些东西,那么这表明您可能需要重新考虑体系结构
此外,调用sleep()的理由也不多
在Java中,一个线程可以进入睡眠状态,这样它就不会占用进程,而其他线程就有机会运行
这不是sleep()的真正用途。在大多数情况下,当线程不需要CPU时,它将阻塞wait()
调用或某些xyz.wait()
调用(其中xyz
是队列或信号量或闩锁或其他更高级别的同步对象)
sleep()函数是一个低级的原语,您的程序可以调用它以满足实时要求。但大多数具有实时性要求的程序都可以使用更高级的工具,如java.util.concurrent.ScheduledThreadPoolExecutor
或者javax.swing.Timer
。如果您从编写自己的sleep()调用开始,而没有首先研究更高级的对象,那么您可能正在重新发明一个轮子
如果其他线程无法在该线程将要休眠时运行锁,那么该线程首先休眠的目的是什么
唯一能回答这个问题的人是编写线程中运行的代码的人
是你吗
正如Nathan Hughes所说,当线程持有互斥锁时,sleep()
实际上从来都不是一个好主意。更进一步地说,线程在保持互斥锁的同时执行任何超过一微秒的操作几乎都不是一个好主意。如果您发现自己编写的代码在锁定锁的同时等待某些东西,那么这表明您可能需要重新考虑体系结构
此外,调用sleep()的理由也不多
在Java中,一个线程可以进入睡眠状态,这样它就不会占用进程,而其他线程就有机会运行
这不是sleep()的真正用途。在大多数情况下,当线程不需要CPU时,它将阻塞wait()
调用或某些xyz.wait()
调用(其中xyz
是队列或信号量或闩锁或其他更高级别的同步对象)
sleep()函数是一个低级的原语,您的程序可以调用它以满足实时要求。但大多数具有实时性要求的程序都可以使用更高级的工具,如java.util.concurrent.ScheduledThreadPoolExecutor
或者javax.swing.Timer
。如果您从编写自己的sleep()调用开始,而没有首先研究更高级别的对象,那么您可能正在重新发明一个轮子。如果它们不需要睡眠线程拥有的锁,它们可以运行。如果他们需要它们,他们将需要等待另一个线程醒来并解锁它们。这是相当模糊的,你有一个具体的例子吗?谢谢