java 線程和線程安全初識

建立線程的兩種方法

繼承Thread類或實現Runnable接口。都是重寫了 run() 方法。 執行線程都是用Thread類的start()方法。java

線程的5種狀態微信

  • 新建狀態(New):線程對象被建立後,就進入了新建狀態。eg,Thread = new Thread();
  • 就緒狀態(Runnable):又稱可執行狀態。線程對象建立後調用了start() 方法啓動線程
  • 運行狀態(Running):線程獲取CPU進行執行。只能從就緒狀態進入運行狀態。
  • 阻塞狀態(Blocked):因某種緣由放棄CPU使用權,暫時中止運行。緣由有三種:
    • 等待阻塞 --> 經過調用線程的wait()或sleep()或join()方法,讓線程等待某工做完成。
    • 同步阻塞 --> 線程在獲取synchronized同步鎖失敗(被其餘線程佔用)
    • 其餘阻塞 --> 經過調用線程的發出了I/O請求時,線程會進入同步阻塞狀態
  • 死亡狀態(Dead):線程執行完了或異常退出了run()方法。結束生命週期

狀態轉換圖

注意

這五種狀態是咱們認知上的五種狀態,固然在程序執行中,阻塞狀態就有多種類型, 下面是java源代碼中的六種狀態併發

  1. NEW 在執行start()方法以前
  2. RUNNABLE 執行或等待資源
  3. BLOCKED 線程在等待monitor鎖(synchronized 關鍵字)
  4. WAITING Object.wait() 和 Thread.join() 和 LockSupport.park() 方法會形成這種等待阻塞
  5. TIMED_WAITING 暫且叫限時等待,是上面方法加了一個等待時間,或者LockSupport的其餘方法
  6. TERMINATED 終止狀態·

線程能夠設置爲守護線程,但必須在調用 start()以前設置。優化

經常使用的同步類(不知道合適不合適)

  • CountDownLatch 一般用來使主線程等待其餘線程執行完再執行所用到
  • ReentrantLock 併發時,它增長了一些synchronized沒有的方法,更方便管理
  • synchronized 簡單的同步就用這個吧

interrupt()和 interrupted()和 isInterrupted() 區別

  • 當某個線程調用了interrupt()方法後,至關於給該線程打上了一箇中斷標誌,若是線程正好處於阻塞狀態,會直接拋出InterruptedException 異常
  • interrupted()方法用來檢測「當前線程」的中斷狀態,且會將中斷狀態標誌清除
  • isInterrupted()方法用來檢測「this」的中斷狀態,且不會改變線程的狀態標誌。

獲取線程終端狀態 要用Thread.currentThread().isInterrupted() 比較標準this

volatile關鍵字

  1. volatile保證可見性 一旦一個共享變量(類的成員變量、類的靜態成員變量)被volatile修飾以後,那麼就具有了兩層語義: 1)保證了不一樣線程對這個變量進行操做時的可見性,即一個線程修改了某個變量的值,這新值對其餘線程來講是當即可見的。 2)禁止進行指令重排序。
  2. volatile不能確保原子性
  3. volatile保證有序性 在前面提到volatile關鍵字能禁止指令重排序,因此volatile能在必定程度上保證有序性。 volatile關鍵字禁止指令重排序有兩層意思: 1)當程序執行到volatile變量的讀操做或者寫操做時,在其前面的操做的更改確定所有已經進行,且結果已經對後面的操做可見;在其後面的操做確定尚未進行; 2)在進行指令優化時,不能將在對volatile變量的讀操做或者寫操做的語句放在其後面執行,也不能把volatile變量後面的語句放到其前面執行。

提個問題,你們能夠想象想,**volatile的應用場景 ** 是什麼,能夠在評論區討論哦!請關注微信公衆號,查看,嘻嘻。不過之後會在評論區回覆的!!線程

最後,建議你們多手動練練,有時候看的時候,感受會了,但動起手來,不必定會了。對象


歡迎關注個人微信公衆號cobs-snail,讓咱們一塊兒前進吧!!排序

前進吧蝸牛

相關文章
相關標籤/搜索