我正在学习Java中的并发,并开始了解信号量,它可以用于同步,而不需要忙于等待。
现在,我想知道Java同步方法/语句和锁(例如重入锁)是不是忙于等待机制?
如果没有,如何通知其他线程,它们是否在幕后实现信号量?
synchronised method()
synchronised(object){}
reeantrant.lock()发布于 2021-10-07 21:35:06
如何通知其他线程,
实际上,所有实用的JVM都让操作系统来做真正的工作。如今,工作站、服务器和移动设备都运行preemptive, multi-tasking operating systems,它是操作系统提供的原始函数,线程、互斥、信号量等都是在这些函数上构建的。
操作系统能做的最重要的事情是程序不能自己做的事情叫做。这时OS挂起一个线程,将其状态保存在一个特殊的“上下文记录”中,然后恢复另一个线程的上下文,允许第二个线程开始使用与第一个线程之前使用的CPU相同的CPU。
每当线程等待锁定互斥锁、等待I/O、等待some_object.notify()或几乎任何其他事情时,OS都会“切换”出它的上下文,将其放入等待该事件的事物队列中,我们说该线程在该事件上被阻塞。当事件发生时(例如,当有人释放互斥锁时),OS将线程的上下文移动到可运行的线程队列中,最终,当CPU变得可用时,它“切换”上下文,线程再次运行。
他们在幕后实现信号量了吗?
Semaphore是一个非常古老的想法:它最初的目的是一个低级的原语操作--一种可以在没有任何硬件支持的情况下以一种神秘的方式实现的操作--在此基础上可以构建互斥、队列、障碍等其他东西。
如今,互斥锁是最低级别的--使用特殊的硬件指令实现--而信号量是建立在互斥锁之上的更高层的对象。我们仍然使用Semaphore的一个主要原因是,太多现有的文献都在谈论信号量,而如此多的现有代码仍然使用信号量。
https://stackoverflow.com/questions/69486861
复制相似问题