Thread類
線程安全
如果有多個線程在同時運行,而這些線程可能會同時運行這段代碼。程序每次運行結(jié)果和單線程運行的結(jié)果是一樣的,而且其他的變量的值也和預(yù)期是一樣的,就是線程安全的
多線程訪問了共享的數(shù)據(jù),就會產(chǎn)生線程安全問題
線程同步:
-
同步代碼塊
synchronized關(guān)鍵字可以用于方法中的某個區(qū)塊中,表示只對這個區(qū)塊的資源實行互斥訪問
synchronized(同步鎖) { 代碼塊 }
同步鎖可以使用任意類型,多個線程要使用同一把鎖
-
同步方法
使用synchronized修飾的方法就叫做同步方法,保證A線程執(zhí)行該方法的時候,其他線程只能在方法外等待
對于非靜態(tài)方法,同步鎖是this
對于靜態(tài)方法,使用當(dāng)前方法所在類的字節(jié)碼對象作為同步鎖 -
鎖機制
java.util.concurrent.locks.Lock
lock()加同步鎖
unlock()釋放同步鎖
java.util.concurrent.locks.ReentraitLock implements Lock
線程狀態(tài):
-
NEW 新建態(tài)
線程剛剛被創(chuàng)建,但是并未啟動,還沒調(diào)用 start() 方法 -
Runnable 可運行態(tài)
線程可以在jvm中運行的狀態(tài),可能正在執(zhí)行代碼,也可能沒有,這取決于cpu調(diào)度 -
Blocked 鎖阻塞態(tài)
當(dāng)一個線程試圖獲取鎖對象,而該鎖對象被其他線程所持有的,則該線程進入Blocked狀態(tài);當(dāng)該線程持有鎖對象時,該線程將變成Runnable狀態(tài) -
Waiting 無限等待態(tài)
一個線程在等待另一個線程執(zhí)行一個(喚醒)動作時,該線程進行Waiting狀態(tài)。進入這個狀態(tài)后是不能自動喚醒的,必須等待另一個線程調(diào)用notify或者notifyAll方法才能夠喚醒 -
Timed Waiting 計時等待態(tài)
同Waiting狀態(tài),有幾個方法有超時參數(shù),調(diào)用它們將進入Timed Waiting狀態(tài)。這一狀態(tài)將一直保持到超時期滿或者接收到喚醒通知。帶有超時參數(shù)的常用方法有Thread.sleep, Object.wait -
Terminated 死亡態(tài)
run方法執(zhí)行完成或者調(diào)用stop方法后,線程進入Terminated狀態(tài)