[英]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.