java線程或多線程相關概念詳解及優化方案

1. 何爲線程
    是程序運行的基本執行單元,是進程中的實際運作單位,是輕量級的子進程;

2. 何爲線程併發
    程序啓動多個線程併發執行;

3. 何爲主線程
    當jvm啓動之後,加載類文件,發現main方法,就會爲main方法創建一個線程,用於方法的執行,這個線程稱之爲主線程;   

4. 何爲線程安全和不安全
    (1)當多個線程同時執行操作共享數據時,就有可能會產生不一樣的數據結果,這就是所謂的線程不安全;
    (2)當多線程和單線程同時執行程序,而最終的結果永遠都是一樣,這就是線程安全;    

5. 何爲多線程
    爲了更好利用cpu的資源,同時不阻塞線程的執行,程序可以開啓多個線程一起執行其他任務,這就是多線程;    

6. 何爲線程池
    頻繁創建和銷燬線程是非常消耗內存資源的,所以就衍生了線程池的概念,用於管理提前建好的多個線程,程序
    需要的時候可以直接使用,提高線程的複用性和系統性能;    

7. 何爲線程的生命週期
    (1)創建(實現線程);
    (2)就緒(啓動start);
    (3)運行(運行run方法);
    (4)等待/阻塞/睡眠(wait/join/sleep);
    (5)終止(run方法stop或者其他異常終止);

8. 何爲線程死鎖
    程序運行時多個線程同時阻塞,其中的一個或全部線程等待某個資源釋放,而改資源又被其他線程鎖定,從而導致每個線程都在等待其他線程釋放資源,都無法結束,這就造成了線程的死鎖;

 9. 何爲線程同步

  • 爲了解決線程不安全問題,需對線程進行同步,即多個線程只能對一個共享資源進行更改,不可對私有數據進行更改;
  • 線程同步的幾種方式:

    (1)使用synchornized關鍵字修飾方法,添加同步鎖;
    (2)使用關鍵字volatile修飾共享變量實現僞同步;
    (3)使用重入鎖實現線程同步,即使用類ReentrantLock類來定義鎖,其中lock()方法爲打開鎖,unlock()方法爲關閉鎖,注意及時釋放鎖,不然會進入死鎖狀態;    

10. 線程的sleep、wait、join
    (1)sleep和wait都會暫停線程,join則一般用於控制線程之間的先後順序;
    (2)sleep不會釋放同步鎖,而wait會釋放同步鎖;

11. 線程的start和run方法
    (1)start()方法會啓動新的線程,這時線程處於就緒狀態,但還沒開始運行,獲取到cpu的時間片之後,就會開始執行run方法,這裏的run方法稱之爲線程體,run運行結束,則線程終止;
    (2)run方法屬於thread類的一個普通方法的調用,在主線程裏面執行,不會開啓新線程;
    (3)run方法包含在start方法裏面;

12. 如何解決多線程中的高併發
    線程高併發是多線程併發處理中必須會遇到的一個問題,這裏分享一下博主的相關解決思路:
    (1)高併發爲何會產生問題?
        當n個線程同時搶佔共享資源數據的時候,如果不進行線程同步,則很難絕對保證線程安全問題,出現諸多問題,例如計算結果數據不一致、線程死鎖、數據庫死鎖等
    (2)高併發優化解決總體方案?
        一方面是保證線程的同步性(限流);另一方面保證任務的執行效率(減壓以及提高質量)
    (3)優化細節?
        同步性方面:synchornized、volatile、ReentrantLock等;
        執行效率方面:
            代碼層:redis等緩存策略;線程池降低資源損耗;減少事務開啓,合併事務單元等;
            項目邏輯層:業務分塊,減輕壓力;分佈式微服務項目部署;使用netty通信;負載均衡策略等;
            數據庫層:數據集羣;分庫分表;讀寫分離策略;使用搜索引擎等優化工具等;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章