經過加鎖保證數據的一致性.也就是說當一個線程訪問某個數據時,經過加鎖操做對數據進行保護,其它線程在加鎖期間不能對其訪問
當多個線程訪問共享變量時,須要經過加鎖來保證數據同步,增長了程序的複雜性. 避免數據同步的一種方式是不共享變量,好比使用局部變量和ThreadLocal
系統爲線程分配CUP使用權的過程
線程的執行時間由線程本身控制,當本身執行完後,主動通知操做系統切換到另一個線程上執行. 好處是實現簡單,線程對本身的操做是可知道的,沒有什麼線程同步問題.缺點是線程執行時間不可控,若是一個線程有問題,可能會一致阻塞在那裏.
每一個線程的執行時間有操做系統分配,線程的切換不禁線程自己決定(Java中,Thread.yield()可讓出執行時間,但沒法獲取執行時間)線程執行時間系統可控,也不會有一個線程致使進程阻塞.
能夠經過設置線程的優先級讓一些線程儘量的先執行多執行(Java一共有10個線程優先級從Thread.MIN_PRIORITY至Thread.MAX_PRIORITY),在兩個線程同時處於ready時,優先級越高越容易被執行.但優先級並不靠譜,由於Java線程時經過映射到原生線程來實現的,因此線程調度仍是取決於操做系統.
可運行線程池中
,變得可運行,就差CPU分配執行時間,其它運行所須要的資源都已經得到.阻塞狀態是由於某種緣由放棄CPU使用權,暫時中止執行,直到線程進入就緒狀態,纔有機會轉到運行狀態.
1.等待阻塞(無限期等待):運行的線程執行wait()方法,該線程會釋放佔用的資源,JVM會把該線程放入等待池
.進入這個狀態後,線程不會自動喚醒,必須依靠其它線程調用notify()或notifyAll()方法才能會被喚醒.java
2.同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被其它線程佔用,則JVM會把該線程放入鎖池
.
3.其它阻塞(限時等待):運行的線程執行了join()或者sleep()方法,或者發起了I/O請求,JVM會把該線程置爲阻塞狀態,當sleep()狀態超時,join()等待線程終止或者超時,I/O處理完成,該線程從新轉入就緒狀態.安全