首頁>Club>
6
回覆列表
  • 1 # 北京華信智原

    第一步,建議先學好作業系統這門課,深入理解程序和執行緒,理解執行緒的狀態轉換和排程;

    第二步,學習Java中執行緒的操作,Java物件的多執行緒特性,練習使用Java程式碼操作執行緒和排程執行緒,執行緒池等高階操作;

    第三步,學習並理解高手的多執行緒程式碼。

  • 2 # 大學生程式設計指南

    java多執行緒的開發屬於java程式設計裡面高階層面應用,實際中應用的場景非常多,舉個簡單的例子,同時下載多個檔案,同時接收多條資料,多個操作同時操作一個數據塊等等這方面涉及到的非常多,在開發app或者企業級應用方面都會涉及到。

    簡單的來說多執行緒程式設計幾乎是所有程式語言裡面比較難的部分了,java經常提到的執行緒池核心也是這部分,其實多執行緒就是併發問題,為了提升效率,正常的多個事情可以事先排好佇列一個個的來也可以把事情做的很好,但是如果每個人都能去找前臺解決問題是不是更好,所以多執行緒的概念就出來了,在這當初算是軟體行業一個革命性的突破,現在幾乎所有的程式語言都具備這種屬性。多個人一起做事情,但如果共同操作一個數據塊豈不是要打架,於是臨界區的概念以及執行緒鎖也就出來了。保證在操作同一個資料區域的時候遵守一個規則,一個數據在一個時間段內只能有一個人來操作。

    現在推薦幾本多執行緒和併發程式設計書籍

    java併發程式設計實戰java多執行緒程式設計核心技術

    基本上兩本書看完對於多執行緒的以及併發性有一個大概的瞭解,然後自己寫個多執行緒操作的例子,可以寫個同時下載多個檔案的例子。

    多執行緒在網路程式設計裡面涉及到的非常多,這塊骨頭啃不下就不要說對java已經很熟悉了。

  • 3 # java攻城獅愛好者

    對於新手來說多執行緒無疑最難理解的部分,平常我們練習最多的就是輸出一些引數,從db中增刪改查操作一些資料,這些都是單執行緒所做的事情,如果遇到了大資料量的處理,IO密集型的任務以及高併發的處理,這時就得用到多執行緒。

    常用的實現方式就是繼承thread,或者實現Runnable介面,還有一種帶有返回值的方式,即實現callable介面來實現多執行緒的處理。當然執行緒頻繁的啟動和關閉是很耗資源的,於是就使用到了執行緒池。可以先學會使用java自帶的四種執行緒池,然後理解執行緒池的原理,比如corePoolSize核心執行緒數,maxPoolSize最大執行緒數,執行緒拒絕策略等。

    單核cpu同時只能執行一個執行緒,在java中的執行緒是隨機執行的,記憶體中會有程式計數器記錄執行緒執行到了哪裡,由於執行緒的切換時間很短,肉眼看起來好像同時執行多個執行緒。所以單核cpu只能實現併發,而多核cpu才能使用多執行緒實現並行,充分利用cpu資源。

    接下來多執行緒肯定會了解到執行緒安全的問題,實現執行緒安全的幾種方式,比如synchronized,lock,volatile,final關鍵字,Atomic類,countdownlatch,concurrent包下的類,CAS的實現原理,TLAB(thread local buffer allocation),執行緒優先順序執行狀態,同步非同步,以及由於鎖競爭導致的死鎖,守護執行緒的作用等。

  • 4 # 此生唯一

    JAVA多執行緒技術太雜,隨著了jdk版本的逐漸迭代,越來越多的多執行緒技術被提出來,原本的還沒掌握又來了新的技術,但是萬變不離其宗,下面來看下多執行緒主要涉及哪些東西?

    1,何為多執行緒?在計算機系統中,CPU負責計算,而記憶體負責資料儲存,執行緒就是作業系統用來進行運算排程的最小單位!顯然,多執行緒就是多個排程單位!

    2,為什麼要使用多執行緒?

    ①,針對單核CPU,CPU在同一時間只能和一個執行緒進行互動,如果這個執行緒因為某些原因出現阻塞,那麼整個計算機就處於停滯狀態,為了避免這一現象,執行緒被設計為多執行緒執行模式,如果一個執行緒阻塞了,另外的執行緒可以繼續使用執行計算,這樣CPU使用效率就得到了極大的提升!

    ②,多核CPU:現在的計算機都被設計為多核的,能保證同一時間可以有多個運算單元,如果多核CPU卻只使用單執行緒,無疑更是極大的浪費了CPU資源!

    多執行緒的使用在很多場景中(批次處理,平行計算等)有著極高的效率,所以使用多執行緒無疑是很重要的!

    3,JAVA中的多執行緒:JAVA中的執行緒與作業系統的執行緒不是一個概念雖然都有相似的幾個執行緒狀態(new,runnable,running,block,waiting,dead),JVM只是作業系統中的一個程序,JAVA的多執行緒只是屬於jvm中的排程單元,具體關係常見如下解釋:https://www.zhihu.com/question/23096638

    唯一需要注意的是,JAVA中的多執行緒都是搶佔式的,由jvm進行排程!

    ⑤,執行緒安全可使用技術:synchronize加鎖,ReenTrantLock可衝入鎖,ReadWriteLock讀寫鎖,CAS原子命令(J.U.C下以Atomic打頭的類基本用CAS實現)樂觀鎖,AQS抽象佇列式同步器;

    ⑥,JDK中的併發容器:StringBuffer,Vector,SynchronizeMap,HashTable,concurrentHashmap(分段鎖思想),ConcurrentLinkedQueue,CopyOnWriteArrayList(高效讀取),ThreadLocal(一個執行緒,一份變數)

    ⑦,網路IO:BIO(同步阻塞IO),NIO(同步非阻塞),AIO(非同步阻塞)

    任何技術都是為業務服務的,具體用什麼技術都還是需要看場景,之前分享了concurrentHashmap,CAS等,之後會有更多的多執行緒,JAVA方面的技術分享,敬請關注。。

  • 5 # 流麥士

    要知道計算機世界的很多思想和方法論都是從現實生活中獲得的靈感,並形成系統性的解決方案。為什麼會有多執行緒

    也許我們可以從實際生活中找到一些靈感。試想在朋友聚會時,大家免不了喝酒盡興,在只有一瓶酒的時候,每個人總不能只用一個酒杯去喝,那麼就會有多個杯子,但是問題出現了,每次只能倒一杯酒,大家碰杯的時候必須等所有人都倒上酒後開始。後來物資豐富了資源變多了,大家不用勒緊腰帶只喝一瓶酒了,可能就是一箱。那麼這時候,多瓶酒一起開啟倒酒,這時候碰杯的等待時間大大大縮短了,大家才能喝的盡興,邊喝邊吹牛。

    看似很簡單的一個生活場景,但是卻能從中抽象性出資源管理上的方法論來。我們在處理一個系統性的事情的時候,如果每個時間點只處理其中一個細節,那麼處理完需要的時間是不可忍受的,因為等待的過程是一種資源的浪費,這時候就需要對事情的處理進行分解,多個任務細節同時展開,從而提高效率。

    在計算機中,隨著技術的發展,多核技術的進步以及分時作業系統的完善,計算機在處理任務的能力上有了巨大提升,多執行緒的處理得到了軟/硬體、理論和實踐的充分支援,成為提高應用系統性能的有效手段。但同時也產生了新的問題,多執行緒的管理。

    如何管理多執行緒

    從上面的簡單生活場景例子我們可以看到,雖然我們提高了倒酒的效率,但是我們忽略了其中很多額外問題,誰來倒酒?先倒給誰?是倒了就喝還是等倒完一起喝?誰來管理等等一系列問題。這些都是具體處理的方法論問題和解決方案。

    在Java中,提供了專門用於處理多執行緒的工具包。倒酒的過程其實就是一個執行緒,多個人一起倒酒那麼就是多執行緒處理,同時倒酒的人合起來就是執行緒池,主執行緒就是我們整個喝酒聚會的過程。java語言中,要成為倒酒的人就必須具有倒酒的資格,這個資格透過Thread或者Runnable獲得,倒完一起喝酒就需要用到執行緒的計數器或者阻塞或者執行緒通訊進行等待,先到給誰需要確定誰的優先順序高....等等,對於現實需求中的每一個細節,Java多執行緒工具包都提供相應的處理元件。

    本文並沒從具體的java技術去說明我們怎麼才能深入JAVA多執行緒的開發,只是從理論上從最簡單的生活場景給提問者提供一些思路,如何去理解多執行緒以及如何去理解我們技術中常見的應用理論和方法。

    寫在最後

    筆者試圖以生活中的常見場景去解釋計算機世界中技術的產生和理論。畢竟我們的需求來源於現實,服務於現實,只有從現實中真正瞭解了實際需求,我們就可以真正知道對應的計算機中都需要有什麼,然後掌握什麼,現實的理論和實踐總會多於計算機中的方法。

  • 6 # 華為雲開發者聯盟

    執行緒安全問題概述賣票問題分析單視窗賣票

    一個視窗(單執行緒)賣100張票沒有問題

    單執行緒程式是不會出現執行緒安全問題的

    多個視窗賣不同的票

    3個視窗一起賣票,賣的票不同,也不會出現問題

    多執行緒程式,沒有訪問共享資料,不會產生問題

    多個視窗賣相同的票

    3個視窗賣的票是一樣的,就會出現安全問題

    多執行緒訪問了共享的資料,會產生執行緒安全問題

    執行緒安全問題程式碼實現

    模擬賣票案例

    建立3個執行緒,同時開啟,對共享的票進行出售

    執行緒安全問題原理分析

    執行緒安全問題產生原理圖

    分析:執行緒安全問題正常是不允許產生的,我們可以讓一個執行緒在訪問共享資料的時候,無論是否失去了cpu的執行權;讓其他的執行緒只能等待,等待當前執行緒賣完票,其他執行緒在進行賣票。

    解決執行緒安全問題辦法1-synchronized同步程式碼塊

    同步程式碼塊:synchronized 關鍵字可以用於方法中的某個區塊中,表示只對這個區塊的資源實行互斥訪問。

    使用synchronized同步程式碼塊格式:

    synchronized(鎖物件){可能會出現執行緒安全問題的程式碼(訪問了共享資料的程式碼)}

    程式碼實現如下:

    注意:

    程式碼塊中的鎖物件,可以使用任意的物件。但是必須保證多個執行緒使用的鎖物件是同一個。鎖物件作用:把同步程式碼塊鎖住,只讓一個執行緒在同步程式碼塊中執行。同步技術原理分析

    同步技術原理:

    使用了一個鎖物件,這個鎖物件叫同步鎖,也叫物件鎖,也叫物件監視器

    3個執行緒一起搶奪cpu的執行權,誰搶到了誰執行run方法進行賣票。

    t0搶到了cpu的執行權,執行run方法,遇到synchronized程式碼塊這時t0會檢查synchronized程式碼塊是否有鎖物件

    發現有,就會獲取到鎖物件,進入到同步中執行

    t1搶到了cpu的執行權,執行run方法,遇到synchronized程式碼塊這時t1會檢查synchronized程式碼塊是否有鎖物件

    發現沒有,t1就會進入到阻塞狀態,會一直等待t0執行緒歸還鎖物件,t0執行緒執行完同步中的程式碼,會把鎖物件歸 還給同步程式碼塊t1才能獲取到鎖物件進入到同步中執行

    總結:同步中的執行緒,沒有執行完畢不會釋放鎖,同步外的執行緒沒有鎖進不去同步。

    解決執行緒安全問題辦法2-synchronized普通同步方法

    同步方法:使用synchronized修飾的方法,就叫做同步方法,保證A執行緒執行該方法的時候,其他執行緒只能在方法外等著。

    格式:

    public synchronized void payTicket(){可能會出現執行緒安全問題的程式碼(訪問了共享資料的程式碼)}

    程式碼實現:

    分析:定義一個同步方法,同步方法也會把方法內部的程式碼鎖住,只讓一個執行緒執行。

    同步方法的鎖物件是誰?

    就是實現類物件 new RunnableImpl(),也是就是this,所以同步方法是鎖定的this物件。

    解決執行緒安全問題辦法3-synchronized靜態同步方法

    同步方法:使用synchronized修飾的方法,就叫做同步方法,保證A執行緒執行該方法的時候,其他執行緒只能在方法外等著。對於static方法,我們使用當前方法所在類的位元組碼物件(類名.class)。

    格式:

    public static synchronized void payTicket(){可能會出現執行緒安全問題的程式碼(訪問了共享資料的程式碼)}

    程式碼實現:

    分析:靜態的同步方法鎖物件是誰?

    不能是this,this是建立物件之後產生的,靜態方法優先於物件

    靜態方法的鎖物件是本類的class屬性–>class檔案物件(反射)。

    解決執行緒安全問題辦法4-Lock鎖

    Lock介面中的方法:

    public void lock() :加同步鎖。public void unlock() :釋放同步鎖

    使用步驟:

    在成員位置建立一個ReentrantLock物件在可能會出現安全問題的程式碼前呼叫Lock介面中的方法lock獲取鎖在可能會出現安全問題的程式碼後呼叫Lock介面中的方法unlock釋放鎖

    程式碼實現:

    分析:java.util.concurrent.locks.Lock介面

    Lock 實現提供了比使用 synchronized 方法和語句可獲得的更廣泛的鎖定操作。相比Synchronized,ReentrantLock類提供了一些高階功能,主要有以下3項:

    等待可中斷,持有鎖的執行緒長期不釋放的時候,正在等待的執行緒可以選擇放棄等待,這相當於Synchronized來說可以避免出現死鎖的情況。透過lock.lockInterruptibly()來實現這個機制。公平鎖,多個執行緒等待同一個鎖時,必須按照申請鎖的時間順序獲得鎖,Synchronized鎖非公平鎖,ReentrantLock預設的建構函式是建立的非公平鎖,可以透過引數true設為公平鎖,但公平鎖表現的效能不是很好。

    公平鎖、非公平鎖的建立方式:

    鎖繫結多個條件,一個ReentrantLock物件可以同時繫結多個物件。ReenTrantLock提供了一個Condition(條件)類,用來實現分組喚醒需要喚醒的執行緒們,而不是像synchronized要麼隨機喚醒一個執行緒要麼喚醒全部執行緒。ReentrantLock和Synchronized的區別

    相同點:

    它們都是加鎖方式同步;都是重入鎖;阻塞式的同步;也就是說當如果一個執行緒獲得了物件鎖,進入了同步塊,其他訪問該同步塊的執行緒都必須阻塞在同步塊外面等待,而進行執行緒阻塞和喚醒的代價是比較高的(作業系統需要在使用者態與核心態之間來回切換,代價很高,不過可以透過對鎖最佳化進行改善);

  • 中秋節和大豐收的關聯?
  • 兔子說我該回哪個家打字成語?