gpt4 book ai didi

java - Java 中的线程连接与锁(或信号量)

转载 作者:行者123 更新时间:2023-11-30 02:19:35 34 4
gpt4 key购买 nike

1 “我们如何确保线程按特定顺序执行”这个问题的答案是适本地使用 join() 方法(引用: http://beginnersbook.com/2015/03/thread-join-method-in-java-with-example/ )。

2 下面 CiCt 第 6 版中 15.5 Call in order 中的一个问题。

假设我们有以下代码:

public class Foo {
public Foo() { ... }
public void first() { ... }
public void second() { ... }
public void third() { ... }
}

“同一个 Foo 实例将被传递给三个不同的线程。ThreadA 将首先调用,threadB 将调用第二个,threadC 将调用第三个。设计一个机制来确保第一个在第二个之前调用,第二个在第三个之前调用。”

本书提供了两种解决方案:1)锁定(解锁)和2)信号量

问题:我想知道为什么这本书没有将 join() 描述为该问题的解决方案之一。

我的理解是join()和lock(unlock)/semapore之间的区别是

join() is waiting until one thread is completed and then start.

lock(unlock) or semaphore only guarantees order of staring threadsbut not waiting until another thread is completed?

我的理解是否正确?

有人可以澄清其中的区别吗?

我还想了解 join()、lock() 和信号量在实际项目或实际示例中的情况。

最佳答案

询问 thread.join() 之间的差异没有任何意义。和lock.lock()/lock.unlock() 。它们用于完全不同的目的。

使用thread.join()让一个线程等待另一个线程死亡。 join() 的一个用例将是一个执行一些冗长计算的程序。主线程可以创建与计算机具有的 CPU 数量一样多的工作线程,并分配每个工作线程来完成计算的一个独立部分。然后主线程可以通过调用 thread1.join() 等待所有工作人员完成任务。 , thread2.join() , ...然后全部完成后,主线程就可以将各个线程产生的部分结果组合成最终结果

<小时/>

使用lock.lock()lock.unlock()通过阻止线程同时访问相同的共享数据来防止线程相互干扰。此用例称为互斥,简称为互斥

Java 语言提供了一种互斥机制--- synchronized block ——以及较新版本的 Java 标准库提供了另一种机制——java.util.concurrent.locks.ReentrantLock 。我可以继续介绍如何、何时以及为何使用它们,但您最好只阅读教程:https://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html

<小时/>

信号量是另一个不同的东西。信号量是一个古老的想法,起源于计算机拥有线程同步硬件支持之前的时代。它们今天仍然存在的主要原因是因为许多旧代码和教科书使用它们/谈论它们。您可以使用信号量进行互斥,但也可以将它们用于其他目的。

在我看来,理解信号量的最好方法是首先理解阻塞队列:信号量实际上是一个虚拟许可的阻塞队列,其中“许可”是无法区分的、无信息的 token 。由于许可证不包含任何信息,因此它们实际上不需要存在。信号量只是记录其中“包含”了多少个许可。

使用信号量可以做的事情,也可以使用空对象的阻塞队列来完成,这就是为什么我说,如果有选择的话,首先学习阻塞队列。

关于java - Java 中的线程连接与锁(或信号量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47253829/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com