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

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

韶景曜
2023-03-14

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

2 15.5中的一个问题在下面的CiCt第6版中按顺序调用。

假设我们有以下代码

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

“同一个Foo实例将传递给三个不同的线程。线程A将首先调用,线程B将调用第二个,线程C将调用第三个。设计一种机制,确保在第二个之前调用first,在第三个之前调用第二个。”

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

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

我的理解是关于连接()和锁(解锁)/塞马星的区别是

join()正在等待一个线程完成后再启动。

锁定(解锁)或信号量只保证开始线程的顺序,而不等待另一个线程完成?

我的理解是否正确?

有人能澄清一下区别吗?

我还想知道在现实世界的项目或实际示例中,连接()、锁()和信号量的案例。

共有1个答案

柳项明
2023-03-14

询问线程之间的区别没有任何意义。join()和锁定。lock()/锁定。解锁()。它们用于完全不同的目的。

使用线程。join()使一个线程等待另一个线程死亡。join()的一个用例是执行一些冗长计算的程序。主线程可以创建与计算机CPU数量相同的工作线程,并分配每个工作线程执行一个独立的计算部分。然后,主线程可以通过调用thread1等待所有工作线程完成任务。join(),Thread2。join()。。。然后,在完成所有操作后,主线程可以将每个线程生成的部分结果合并为最终结果

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

Java语言提供了一种互斥机制--<代码>同步块--Java标准库的较新版本提供了另一种机制--<代码>Java。util。同时发生的锁定。可重入锁定。我可以继续讲述如何、何时以及为什么使用它们,但您最好只阅读教程:https://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html

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

IMO理解信号量的最佳方法是首先理解阻塞队列:信号量实际上是虚拟许可的阻塞队列,其中“许可”是无法区分的、无信息的令牌。由于许可没有信息,它们实际上不需要存在。信号量只是计算“其中”有多少许可。

对于一个信号量,你做不了什么,对于一个空对象的阻塞队列,你也做不了什么,这就是为什么我说,如果你有选择的话,先学习阻塞队列。

 类似资料:
  • 在使用信号量时,我应该注意多线程问题吗?在我的测试之后,似乎有一段时间信号灯#release not cause acquire wake up,即使有足够的许可证。 底部是我的测试代码。 带有2个许可证的信号灯 Thread3和Thread2先向上 线程3获取许可,等待锁,锁将由线程1通知 线程2获取许可,等待锁1,锁1将由线程3通知 线程1启动,线程1和线程2先睡眠30ms启动 线程1通知锁定

  • 问题内容: 信号量和自旋锁之间的基本区别是什么? 什么时候在自旋锁上使用信号灯? 问题答案: 自旋锁和信号灯的主要区别在于四点: 1.他们是什么 一个 自旋锁 是一个可能实现的锁,即一个由忙等待(“旋转”)来实现。信号量是锁的概括(或者相反,锁是信号量的特例)。通常( 但不是必须) ,自旋锁仅在一个进程内有效,而信号量也可用于在不同进程之间进行同步。 锁用于互斥,即 一次一个 线程可以获取该锁并继

  • 信号与槽可以通过使用手写代码显式的实现关联 ,也可以运用 QMetaObject 类规定的槽 函数命名范式来实现自动关联。 10.5.1 显式关联 首先我们来看一下,不使用“自动关联规则”的情形。 在下面这段代码里面,我们定义了一个对话框类,它有一个私有的槽 checkValues(), 它用来检验用户提供的值是否正确。 class ImageDialog : public QDialog, pr

  • 我想使用4个线程和信号量来实现游戏。 我设法使线程按照所需的顺序工作:。 然而,我无法使整个过程循环。 每个方法都有自己的信号量,尽管在释放下一个方法信号量之前锁定了自己的信号量,但这些方法只是不挂起第二个获取(实际上是方法中的第一个)。

  • 问题内容: 每个连接异步套接字的非阻塞Java NIO仍然比标准线程慢吗? 另外,如果要在每个连接中使用线程,是仅创建新线程还是使用很大的线程池? 我正在用Java写一个MMORPG服务器,如果有足够强大的硬件,它应该能够轻松扩展10000个客户端,尽管最大客户端数量是24000(由于15000个线程,我认为每个连接模型的线程都无法达到) Java中的限制)。从三年前的一篇文章中,我听说每个连接模

  • 主要内容:1 什么是Java线程死锁,2 Java线程死锁的例子1 什么是Java线程死锁 Java中的死锁是多线程的一部分。当线程正在等待由另一个线程获取的对象锁而第二个线程正在等待由第一个线程获取的对象锁时,可能会发生死锁。由于两个线程都在互相等待释放锁,因此这种情况称为死锁。 2 Java线程死锁的例子 输出结果为: