簡體   English   中英

Java中的線程連接與鎖(或信號量)

[英]thread join vs. lock ( or semaphore ) in java

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()和lock(unlock)/ semapore之間的區別是

join()正在等待直到一個線程完成然后再啟動。

鎖定(解鎖)或信號量僅能保證凝視線程的順序,而不等到另一個線程完成后才開始?

我的理解正確與否?

有人可以澄清區別嗎?

我也想知道實際項目或實際示例中join(),lock()和信號量的案例。

詢問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理解信號量的最佳方法是首先了解阻塞隊列:信號量實際上是虛擬許可證的阻塞隊列,其中“許可證”是無法區分的,無信息的令牌。 由於許可證不包含任何信息,因此它們實際上並不需要存在。 信號量僅統計其中有多少許可證。

對於信號量,您無能為力,對於空對象的阻塞隊列,您也無能為力,這就是為什么我說,如果有選擇,請先學習阻塞隊列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM