1. 程式人生 > >Java執行緒總結

Java執行緒總結

一、Java執行緒同步原理

Java會為每個object物件分配一個monitor,當某個物件的同步方法(synchronized methods )被多個執行緒呼叫時,該物件的monitor將負責處理這些訪問的併發獨佔要求。
當一個執行緒呼叫一個物件的同步方法時,JVM會檢查該物件的monitor。如果monitor沒有被佔用,那麼這個執行緒就得到了monitor的佔有權,可以繼續執行該物件的同步方法;如果monitor被其他執行緒所佔用,那麼該執行緒將被掛起,直到monitor被釋放。
當執行緒退出同步方法呼叫時,該執行緒會釋放monitor,這將允許其他等待的執行緒獲得monitor以使對同步方法的呼叫執行下去。
注意:Java物件的monitor機制和傳統的臨界檢查程式碼區技術不一樣。Java的一個同步方法並不意味著同時只有一個執行緒獨佔執行,但臨界檢查程式碼區技術確實會保證同步方法在一個時刻只被一個執行緒獨佔執行。Java的monitor機制的準確含義是:任何時刻,對一個指定object物件的某同步方法只能由一個執行緒來呼叫。
Java物件的monitor是跟隨object例項來使用的,而不是跟隨程式程式碼。兩個執行緒可以同時執行相同的同步方法,比如:一個類的同步方法是xMethod(),有a,b兩個物件例項,一個執行緒執行a.xMethod(),另一個執行緒執行b.xMethod(). 互不衝突。

二、wait()、notify(),notifyAll()的使用

obj.wait()方法將使本執行緒掛起,並釋放obj物件的monitor。只有其他執行緒呼叫obj物件的notify()或notifyAll()時,才可以被喚醒。
obj.notifyAll()方法喚醒所有該obj物件相關的沉睡執行緒,然後被喚醒的眾多執行緒開始競爭obj物件的monitor佔有權,最終得到的那個執行緒會繼續執行下去,但其他執行緒還將繼續等待。
obj.notify()方法是隨機喚醒一個沉睡執行緒。
wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,
如:

synchronized(x){
x.notify()
//或者wait()
}
以上內容說明了為什麼呼叫wait(),notify(),notifyAll()的執行緒必須要擁有obj例項物件的monitor佔有權。
每個物件例項都有一個等待執行緒佇列。這些執行緒都是等待對該物件的同步方法的呼叫許可。對一個執行緒來說,有兩種方法可以進入這個等待執行緒佇列。一個是當其他執行緒執行同步方法時,自身同時也要執行該同步方法;另一個是呼叫obj.wait()方法。
當同步方法執行完畢或者執行wait()時,其他某個執行緒將獲得物件的訪問權。當一個執行緒被放入等待佇列時,必須要確保可以通過notify()的呼叫來解凍該執行緒,以使其能夠繼續執行下去。

三、wait()與sleep()的區別:

sleep()函式是Thread類的靜態函式,不涉及到執行緒間同步概念,僅僅為了讓一個執行緒自身獲得一段沉睡時間。sleep可以在任何地方使用。sleep指執行緒被呼叫時,佔著CPU不工作,形象地說明為“佔著CPU睡覺”,此時,系統的CPU部分資源被佔用,其他執行緒無法進入,會增加時間限制。
wait函式是object類的函式,要解決的問題是執行緒間的同步,該過程包含了同步鎖的獲取和釋放,呼叫wait方法將會將呼叫者的執行緒掛起,直到其他執行緒呼叫同一個物件的notify方法才會重新啟用呼叫者。wait指執行緒處於進入等待狀態,形象地說明為“等待使用CPU”,此時執行緒不佔用任何資源,不增加時間限制。
注意,執行緒呼叫notify()之後,只有該執行緒完全從 synchronized程式碼裡面執行完畢後,monitor才會被釋放,被喚醒執行緒才可以真正得到執行權。

相關推薦

java執行總結--synchronized關鍵字,原理以及相關的鎖

在多執行緒程式設計中,synchronized關鍵字非常常見,當我們需要進行“同步”操作時,我們很多時候需要該該關鍵字對程式碼塊或者方法進行鎖定。被synchronized鎖定的程式碼塊,只能同時有一條執行緒訪問該程式碼塊。 上面是很多人的認識,當然也是我之前對synchronized關鍵字的淺

JAVA執行總結( 二)

繼續上篇的總結,這次我們講執行緒同步機制 執行緒同步是為了確保執行緒安全,所謂執行緒安全指的是多個執行緒對同一資源進行訪問時,有可能產生資料不一致問題,導致執行緒訪問的資源並不是安全的。如果多執行緒程式執行結果和單執行緒執行的結果是一樣的,且相關變數的值與預期值一樣,則是執行緒安全的。

JAVA執行總結(完結篇)

執行緒池概述 程式啟動一個新執行緒成本是比校高的,因カ它渉及到要與作業系統迸行互動而使用執行緒池可以很好的提高效能,尤其是當程式中要建立大量生存期很短的執行緒吋,更應該考慮執行緒池.執行緒池裡的毎一個執行緒程式碼結束後,井不會死亡,而是再次回到執行緒池中成為空閒

Java執行總結

一、Java執行緒同步原理 Java會為每個object物件分配一個monitor,當某個物件的同步方法(synchronized methods )被多個執行緒呼叫時,該物件的monitor將負責處理這些訪問的併發獨佔要求。當一個執行緒呼叫一個物件的同步方法時,JVM會檢

Java執行總結(八):併發包------讀寫鎖ReadWriteLock的簡單例子詳細理解

初次接觸ReadWriteLock類時也在網上查了很多資料,很容易瞭解到ReadWriteLock是讀寫鎖,並且讀寫鎖的機制有以下三個特點:  讀鎖---讀鎖    (不互斥)  讀鎖---寫鎖     (互斥)  寫鎖---寫鎖     (互斥)什麼意思呢?網上很多資料,

Java執行總結---第一天

執行緒和程序各自有什麼區別和優劣: 程序是資源分配的最小單位,執行緒是程式執行

Java執行模型總結

1. 計算機系統 使用快取記憶體來作為記憶體與處理器之間的緩衝,將運算需要用到的資料複製到快取中,讓計算能快速進行;當運算結束後再從快取同步回記憶體之中,這樣處理器就無需等待緩慢的記憶體讀寫了。 快取一致性:多處理器系統中,因為共享同一主記憶體,當多個處理器的運算任務都設計到同一塊記憶體區域

Java執行學習和總結執行的概念)

執行緒的概念: 多執行緒允許在程式中併發執行多個指令流,每個指令流都稱為一個執行緒,彼此間互相獨立。它和程序一樣擁有獨立的執行控制,由作業系統負責排程,區別在於執行緒沒有獨立的儲存空間,而是和所屬程序中的其它執行緒共享一個儲存空間,這使得執行緒間的通訊遠較程序簡單。 具體到java記憶體模型,

java執行學習總結

1.理解程式、程序、執行緒的概念 程式可以理解為靜態的程式碼 程序可以理解為執行中的程式。 執行緒可以理解為程序的進一步細分,程式的一條執行路徑 2.如何建立java程式的執行緒(重點) 方式一:繼承於Thread類   class PrintNum

【小家Java】一次Java執行池誤用(newFixedThreadPool)引發的線上血案和總結

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9

java執行學習總結(一)

(宣告:並非原創,只是一個簡單總結) 一、執行緒和程序的概念:            程序:程序是處於執行過程中的程式,並且具有一定的對功能,是系統進行資源分配和排程的一個獨立單位。      

總結java執行池的處理策略

執行緒池 任務提交給執行緒池之後的處理策略: 如果當前執行緒池中的執行緒數目<corePoolSize,則每來一個任務,就會建立一個執行緒去執行這個任務; 如果當前執行緒池中的執行緒數目>=corePoolSize,則每來一個任務,會嘗試將其新增到任務快取隊列當中,若

Java執行池簡單總結

概述 執行緒可認為是作業系統可排程的最小的程式執行序列,一般作為程序的組成部分,同一程序中多個執行緒可共享該程序的資源(如記憶體等)。在單核處理器架構下,作業系統一般使用分時的方式實現多執行緒;在多核處理器架構下,多個執行緒能夠做到真正的在不同處理核心並行處理。

JAVA執行池精華總結

一. 為什麼用執行緒池(執行緒池的作用) 1. 建立/銷燬執行緒伴隨著系統開銷,過於頻繁的建立/銷燬執行緒,會很大程度上影響處理效率 例如: 記建立執行緒消耗時間T1,執行任務消耗時間T2,銷燬執行緒消耗時間T3 如果T1+T3>T2,那麼是不是說開啟一個執行

Java執行Java JVM 記憶體模型總結

Java的併發採用的是共享記憶體模型(而非訊息傳遞模型),執行緒之間共享程式的公共狀態,執行緒之間通過寫-讀記憶體中的公共狀態來隱式進行通訊。多個執行緒之間是不能直接傳遞資料互動的,它們之間的互動只能通過共享變數來實現 同步是顯式進行的。程式設計師必須顯式指定某個方法或某段

總結】53道JAVA執行面試題

1) 什麼是執行緒? 執行緒是作業系統能夠進行運算排程的最小單位,它被包含在程序之中,是程序中的實際運作單位。程式設計師可以通過它進行多處理器程式設計,你可以使用多執行緒對運算密集型任務提速。比如,如果一個執行緒完成一個任務要100毫秒,那麼用十個執行緒完成改任務只需10毫秒。Java在語言層面

java執行基礎方面的總結-多執行(一)

1:  同學,解釋一下什麼是執行緒,什麼是程序,我們為什麼要使用多執行緒   我的理解就是程序就是一段可執行的程式,而線相當於執行這段程式中一個可執行的單元     接下來我們從兩個方面解釋為什麼要使用多執行緒減少響應得到時間,我們如果使用單執行緒的話,例如某個操作很耗時間,

Java執行總結執行安全佇列Queue

在Java多執行緒應用中,佇列的使用率很高,多數生產消費模型的首選資料結構就是佇列。Java提供的執行緒安全的Queue可以分為阻塞佇列和非阻塞佇列,其中阻塞佇列的典型例子是BlockingQueue,非阻塞佇列的典型例子是ConcurrentLinkedQueue,在實際

java執行池技術總結

1.Executor 執行緒池頂層介面,只有一個execute方法,void execute(Runnable command); 2.ExecutorService介面繼承於Executor介面 3.Executors 是操作Executor的工具類 Executo

java 執行方法join的簡單總結

雖然關於討論執行緒join方法的部落格已經很多了,不過個人感覺挺多都討論得不夠全面,所以我覺得有必要對其進行一個全面的總結。   一、作用   Thread類中的join方法的主要作用就是同步,它可以使得執行緒之間的並行執行變為序列執行。具體看程式碼: public class JoinTest {