Java多線程概念(一)

線程安全:

經過加鎖保證數據的一致性.也就是說當一個線程訪問某個數據時,經過加鎖操做對數據進行保護,其它線程在加鎖期間不能對其訪問

線程封閉

當多個線程訪問共享變量時,須要經過加鎖來保證數據同步,增長了程序的複雜性. 避免數據同步的一種方式是不共享變量,好比使用局部變量和ThreadLocal

線程調度

系統爲線程分配CUP使用權的過程
  • 協同式線程調度
線程的執行時間由線程本身控制,當本身執行完後,主動通知操做系統切換到另一個線程上執行. 好處是實現簡單,線程對本身的操做是可知道的,沒有什麼線程同步問題.缺點是線程執行時間不可控,若是一個線程有問題,可能會一致阻塞在那裏.
  • 搶佔式線程調度
每一個線程的執行時間有操做系統分配,線程的切換不禁線程自己決定(Java中,Thread.yield()可讓出執行時間,但沒法獲取執行時間)線程執行時間系統可控,也不會有一個線程致使進程阻塞.

java線程調度就是搶佔式調度

能夠經過設置線程的優先級讓一些線程儘量的先執行多執行(Java一共有10個線程優先級從Thread.MIN_PRIORITY至Thread.MAX_PRIORITY),在兩個線程同時處於ready時,優先級越高越容易被執行.但優先級並不靠譜,由於Java線程時經過映射到原生線程來實現的,因此線程調度仍是取決於操做系統.

狀態轉換

  • 新建(New)建立後還沒有啓動的線程
  • 運行(Runnable):Runnable包括操做系統中的Running和Ready. 處於此狀態的線程有可能在運行,也有可能在等待CPU爲它分配執行時間.線程建立後,其它線程調用了該線程的start方法,那麼該線程就位於可運行線程池中,變得可運行,就差CPU分配執行時間,其它運行所須要的資源都已經得到.
  • 無限期等待(Waiting):該狀態下的線程不會被分配CPU執行時間,要等待被其它線程進行顯示喚醒. 如沒有設置timeout的Object.wait()方法和Thread.join()方法,以及LockSupport.park()方法
  • 限時等待(Timed Waiting):該狀態下的線程不會被分配CPU執行時間,只不過不須要被顯示的喚醒,在必定時間後會被系統自動喚醒. 如Thread.sleep(),設置了timeout的Object.wait()和Thread.join(),LockSupport.parkNanos()以及LockSupport.parkUntil()方法
  • 阻塞(Blocked):線程被阻塞了,與等待的區別是:阻塞線程在等待一個排它鎖.
阻塞狀態是由於某種緣由放棄CPU使用權,暫時中止執行,直到線程進入就緒狀態,纔有機會轉到運行狀態.
  • 結束(Terminated):線程執行完了或者異常退出了run()方法,該線程結束生命週期

阻塞常見的三種狀況

1.等待阻塞(無限期等待):運行的線程執行wait()方法,該線程會釋放佔用的資源,JVM會把該線程放入等待池.進入這個狀態後,線程不會自動喚醒,必須依靠其它線程調用notify()或notifyAll()方法才能會被喚醒.java

2.同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被其它線程佔用,則JVM會把該線程放入鎖池.
3.其它阻塞(限時等待):運行的線程執行了join()或者sleep()方法,或者發起了I/O請求,JVM會把該線程置爲阻塞狀態,當sleep()狀態超時,join()等待線程終止或者超時,I/O處理完成,該線程從新轉入就緒狀態.安全

相關文章
相關標籤/搜索