方式:
繼承Thread重新run方法 實現Runnable接口 實現Callable 接口
擴充:
Callable 和 Runnable 區別:
runnable 沒有返回值,callable可以拿到返回值。
callable 可以看做是runnable 的補充
產生:
一個資源只能被一個進程使用
一個進行因多次請求造成阻塞,依然對已訪問的資源保持不放
進程已經獲取到資源的使用權,但是一直未使用
同一個進程,頻繁的獲取資源的使用權,一直未釋放
防止:
加鎖順序(線程按照一定的順序加鎖)
加鎖時間(線程嘗試獲取鎖的時候,加上一定的時間,超過時間限制,則放棄對資源的鎖)
死鎖檢測(一般是吧所有的鎖,都放在map中,檢測map中的鎖)
擴充:
線程和進程的區別:
一個程序至少有一個進程,一個進程至少有一個線程;一個進程也可以有多個線程,來增加程序的執行速度。
守護線程是什么:
守護線程就是后台的一種特例進程,它獨立於控制終端,並且周期性的執行某種任務,或者等待處理某些事情發生的事件,在java種
垃圾回收就是一種特殊的守護線程。
線程有哪些狀態:
new 尚未啟動
Runnable 正在執行
blooked 阻塞的,(被同步鎖,或者io鎖阻塞)
waiting 永久等待狀態
time_waiting 等待指定時間,重新被喚醒的狀態
terminated (吹美內特) 執行完成
sleep 和 wait 的區別:
類的不同:sleep 來自Thread wait 來自Object
釋放鎖: sleep不需要釋放鎖,wait需要手動釋放
用法不同: sleep 時間到了之后自動喚醒, wait 可以使用 notify() notifyAll()直接喚醒。
notify 和 notifyAll 區別
notifyAll 喚醒所有的等待線程,notify喚醒一個
notifyAll 調用后,將全部等待的線程由等待池,移動到鎖池,然后參與鎖的競爭,競爭成功者則繼續執行,如果未成功則繼續留在鎖池,等待鎖釋放之后繼續競爭。
notify 喚醒一個,具體是哪一個,這個由虛擬機控制。