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

时间:2017-11-12 20:52:01

标签: java multithreading

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的同一个实例将被传递给三个不同的线程.ThreadA将首先调用, threadB将调用第二个,而threadC将调用第三个。 设计一种机制来确保这一点 第一个在第二个之前调用,第二个在第三个之前调用。“

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

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

我的理解是关于join()和lock(unlock)/ semapore

之间的区别
  

join()等待一个线程完成然后启动。

     

锁定(解锁)或信号量只保证启动线程的顺序   但是没等到另一个线程完成?

我的理解是否正确?

有人可以澄清区别吗?

此外,我想了解实际项目或实际示例中join(),lock()和信号量的案例。

1 个答案:

答案 0 :(得分:2)

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

使用thread.join()使一个线程等待另一个线程死亡。 join()的一个用例是执行一些冗长计算的程序。主线程可以创建尽可能多的工作线程,因为计算机具有CPU并为每个工作者分配一个独立的计算部分。然后主线程可以通过调用thread1.join()thread2.join()来等待所有工作人员完成任务......然后在完成所有工作之后,主线程可以组合由每个线程都进入最终结果

使用lock.lock()lock.unlock()阻止线程干扰,防止它们同时访问相同的共享数据。这个用例被称为互斥,或者简称为互斥

Java语言提供了一种互斥机制 - synchronized块 - 而新版本的Java标准库提供了另一种机制--- java.util.concurrent.locks.ReentrantLock。我可以继续讨论如何以及何时以及为何使用它们,但是阅读教程后你会更好:https://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html

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

IMO理解信号量的最佳方法是首先理解阻塞队列:信号量实际上是虚拟许可的阻塞队列,其中"允许"是无法区分的,无信息的令牌。由于许可证不携带任何信息,因此它们实际上并不需要存在。信号量只计算在"中的许可数量。它

对于信号量,您无法做任何事情,您也可以使用空对象的阻塞队列,这就是为什么我说,如果您有选择,首先要学习阻塞队列。