我正在学习Java中的并发,并且了解了信号量,它可以用于同步而无需忙于等待。
现在,我想知道 Java 同步方法/语句和锁(例如重入锁)是否是忙等待机制?
如果没有,其他线程如何得到通知,他们是否在后台实现信号量?
synchronised method()
synchronised(object){}
reeantrant.lock()
我正在学习Java中的并发,并且了解了信号量,它可以用于同步而无需忙于等待。
现在,我想知道 Java 同步方法/语句和锁(例如重入锁)是否是忙等待机制?
如果没有,其他线程如何得到通知,他们是否在后台实现信号量?
synchronised method()
synchronised(object){}
reeantrant.lock()
其他线程如何得到通知,
几乎所有实用的 JVM 都让操作系统完成真正的工作。如今,工作站、服务器和移动设备都运行抢占式、多任务操作系统,而正是操作系统提供了构建线程、互斥体、信号量等的原始功能。
操作系统可以做而程序自己不能做的最重要的事情称为上下文切换。这就是操作系统暂停一个线程的地方,将其状态保存在一个特殊的“上下文记录”中,然后恢复其他线程的上下文,允许第二个线程开始使用第一个线程之前使用的 CPU。
每当一个线程等待锁定一个互斥体、等待 I/O、forsome_object.notify()
或几乎其他任何东西时,操作系统都会“切换”它的上下文,将其放入等待该事件的事物队列中,我们说线程在事件中被阻塞。当事件发生时(例如,当有人释放互斥锁时),操作系统将线程的上下文移动到RUNNABLE的线程队列中,最终,当 CPU 可用时,它“切换”上下文,线程进入再次运行。
他们是否在引擎盖下实现了信号量?
Semaphore
是一个非常古老的想法:它最初是一种低级的原始操作——可以以一种神秘的方式实现,无需任何硬件支持——基于它的其他东西,如互斥、队列、屏障等。可以建造。
如今,互斥体是最低级别的——使用特殊的硬件指令实现——而信号量是建立在互斥体之上的更高级别的对象。我们仍然拥有的主要原因之一Semaphore
是现有文献中很多都在谈论信号量,并且很多现有代码仍然使用信号量。