当前位置: 首页 > 知识库问答 >
问题:

信号量:在一个线程中获取的许可可以从另一个线程释放-示例

华和悦
2023-03-14

我正在考虑一个语句的示例“在一个线程中获取许可证,然后从另一个线程中释放”。

我对信号量的理解是,它维护一组许可。Thread应在通过临界截面之前获得许可证,然后许可证递减1。一旦Thread完成临界截面,它将释放许可证,许可证将增加1<示例
1。ATM机,配备一名保安,根据机器的可用性允许人们使用。机器越多,许可证就越多。一位客户购买了一台ATM机,完成后将其释放
2。银行的柜台,如果柜台空闲,客户会收到通知,然后他/她可以去柜台与柜台的主管交谈并完成工作。那么多柜台,那么多就是许可证。

那么,一个线程获得的许可被另一个线程释放的简单场景/示例是什么?

共有1个答案

连俊智
2023-03-14

您的ATM示例很好。假设客户通过一扇门进入,然后通过另一扇门离开,每个门都由一个线程管理。

或者,举一个更典型的例子,假设您与数据库的连接数量有限。一个线程必须等待开始处理请求,直到它获得与数据库的连接。然后该线程向数据库发送请求。但是在您收到对数据库的回复之前,您无法进行任何进一步的前进。强制一个线程等待从数据库获取回复是否有意义,只是为了让拥有数据库连接所有权的同一线程可以释放它?

当接收到数据库回复时,让正在运行的线程来处理它会更有意义。然后,该线程可以释放连接,而不管在获取连接所有权时运行的是哪个线程。

抽象地考虑一下这个模型:
1.线程获取资源的所有权。
2.线程使用资源。
3.线程释放资源的所有权。

这很好,但如果第2步由多个线程更好地处理呢?然后,要确保步骤3由与步骤1相同的线程执行,就需要付出额外的努力。

 类似资料:
  • 据我所知,线程可以释放信号量,而无需首先使用WaitOne获取锁。 所以,如果我们有线程A、B和C以及一个信号量,A和B调用WaitOne,得到一个锁,然后开始做他们的工作<线程C出现了,只需在信号量上调用Release。 这应该将信号量的计数增加1。这是否意味着信号量将终止A或B,或者只允许第三个线程获取锁并在其池中有3个线程,即使最大值为2?

  • 在一个android服务中,我创建了用于执行一些后台任务的线程。 我遇到一个情况,线程需要在主线程的消息队列上发布特定任务,例如。 有没有方法获取主线程的并从我的另一个线程向它发布/?

  • 在Flink中,像“平面地图”、“地图”等运算符称为任务,如果我将平面地图的并行度设置为30,那么这个任务有30个子任务。 现在,如果我只有一个插槽,它会在一个插槽中产生多个线程吗?还是每个插槽只有一个线程? Flink会在该插槽中简单地创建30个线程,还是使用类似线程池的东西? 以上不是一个恰当的例子。 假设在作业中我有操作符flatMap和map,它们都有并行度1,我只有一个插槽,这个插槽会创

  • 我正在阅读这篇文章,关于从一个线程中断另一个线程的建议是 “”“如果正确实施,以下几种方法应该可以奏效。 您可以让两个线程定期检查一些常见的标志变量(例如,将其称为stopNow),并安排两个线程在完成时进行设置。(标志变量需要是volatile…或正确同步的。) 您可以让两个线程定期调用线程。isInterrupted()方法,查看它是否已被中断。然后每个线程都需要调用线程。完成后,在另一个上中

  • 我有一个应用程序,它在一个单独的线程中的while循环中重复运行一些东西,直到用户触发关闭信号。我可以通过在工作线程中设置(易失性)布尔字段,将信号从主线程发送到工作线程,但是否有其他关闭/中断线程的方法,例如通过“java”中的任何实用程序。util。并发'? 我尝试调用ExecutorService的shutdown()或shutdownNow()方法,但它们无法停止工作线程。同时调用shut

  • 问题内容: 考虑下面的Java示例。请注意,两个类成员变量都没有声明为。如果我正确地理解了内存模型并理解了“之前发生”的规则,那么Java实现可以优化该方法,使其永远运行,即使另一个线程调用该方法也是如此。之所以会发生这种情况,是因为该方法中没有任何东西可以强制线程读取多个值。那是对的吗?如果没有,为什么不呢? 问题答案: 可以由另一个线程修改,但这不是保证。这也不是线程安全的。要使变量保证从另一