三種線程池的特點及範圍:
1-繼承Thread類,重寫父類run()方法。
2-實現runnable接口。
3-使用Executor Service。
多線程同步機制:
1-在需要同步的方法中加入synchronized關鍵字。
同步方法,synchronized在方法上;同步代碼塊,synchronized在代碼塊上。
2-使用lock鎖對象。鎖是對象的。JDK5,java.util.concurrent.lock包。
監視器和鎖在Java虛擬機一塊使用。監視器監視一塊同步代碼塊,確保一次只有一個線程執行同步代碼塊。
每一個監視器都和一個對象引用相關聯,線程獲取鎖之前不允許執行同步代碼塊。
3-流程:
拿到lock鎖執行權限(一個對象一把鎖)
---->無鎖---->等待隊列(線程阻塞)
---->有鎖---->執行同步代碼塊sychronized---->執行完把鎖還給同步對象
4-保證同步代碼在同一時刻只有一個線程在執行。
啓動線程用start(),可運行狀態。
run()方法可以產生必須退出的標識來停止一個線程。
線程的幾種可用狀態:
Runnable-就緒:線程準備運行,不一定立馬開始。
Running-運行中:進程正在執行線程的代碼。
Waiting-等待中:線程阻塞。wait():Object類的方法,釋放鎖對象,notify()線程進入對象鎖定池。
Sleeping-睡眠中。sleep():Thread線程類的方法,不釋放鎖對象,暫停時間到自動恢復。
Blocked on I/O-IO阻塞:等待IO操作完成。
Blocked on Synchronization-同步阻塞:等待獲取鎖。
Dead-死亡:線程完成執行。
死鎖:
1-兩個進程都在等待對方執行完畢才能繼續往下執行時發生死鎖。
2-強制線程按照指定的順序獲取鎖,可以確保N個線程可以訪問N個資源的同時不發生死鎖。