Synchronized和volatile關鍵字的作用以及線程都相關知識點

#### Synchronized和volatile關鍵字的作用

一旦一個共享變量(類的成員變量、類的靜態成員變量)被volatile修飾後,就具備了兩層含義:

- 保證了不同線程對這個變量進行操作時都可見性,即一個線程修改了某個共享變量的值,這個新值對其他線程來說是立即可見的
- 禁止進行指令重排序。volatile的本質是在告訴JVM當前變量在寄存器(工作內存)中都值是不確定的,需要從主存中讀取

| 比較點 | Synchronized | volatile |

Synchronizedvolatile
使用級別 可以使用在變量、方法、類級別 只能使用在變量級別
能否保證變量都原子性 可以保證變量都修改可見性和原子性 只能保證變量修改都可見性、不能保證原子性
能否造成線程阻塞 不能
會不會被編譯器優化 不會

說說對線程池的瞭解

- 降低資源消耗。通過重複利用已經創建都線程降低線程創建和線程銷燬造成的損耗
- 提高響應速度。當任務到達時,任務可以不需要等到線程創建就能立即執行
- 提高線程的可管理性。線程是稀缺資源,如果無限制都創建,不僅會消耗系統資源,還會降低系統的穩定性,使用線程池可以進行統一都分配、調優和監控

什麼情況下導致線程的死鎖,遇到線程死鎖怎麼解決?

1. 死鎖都定義:死鎖是指多個線程因競爭資源而造成都一種僵局、若無外力作用,這些線程都將無法向前推薦
2. 產生死鎖都必要條件
- 互斥條件:線程要求對所分配都資源(如打印機)進行排他性控制,即在一段時間內某資源僅爲一個線程所佔有。此時如有其他線程請求該資源,則請求線程只能等待
- 不剝奪條件。線程所獲的都資源在未使用完畢之前,不能被其他線程強行奪走,即只能由獲得該資源都線程自己來釋放
- 請求和保持條件:線程已經保持了至少一個資源,但又提出了新的資源請求,而該資源已經被其他線程佔有,此時請求線程被阻塞,但對自己已經獲得的資源保持不放
- 循環等待條件:存在一種線程資源的循環等待鏈,鏈中都每一個線程已經獲得都資源同時被鏈中下一個線程所請求
3. 如何避免死鎖
1. 加鎖順序(線程按照一定都順序加鎖)
2. 加鎖時限(線程嘗試獲取鎖的時候加上一定都時間限制,超過限制則放棄對該鎖都請求,並釋放自己佔有都鎖)

java中多線程之間都通信如何實現?

1. 共享變量:線程間通信可以通過發送信號,發送信號的一個簡單方式是在共享對象都變量裏設置信號值
2. wait/notify機制:以資源爲例,生產者生產一個資源,通知消費者就消費掉一個資源,生產者繼續生產資源,消費者消費資源,以此循環。

請說出同步線程及線程調度都相關方法

方法說明
wait() 使得一個線程進入等待狀態(阻塞),並且釋放所持有的鎖
sleep() 使一個正在運行都線程處於睡眠狀態,是一個靜態方法,調用此方法要處理InterruptedException異常
notify() 喚醒一個處於等待狀態都線程,在調用此方法後,並不能確定回喚醒哪個等待的線程,是由JVM來確定,與優先級無關
notifyAll() 喚醒所有處於等待狀態都線程,該方法比較並不是將對象都鎖給所有線程,而是讓他們競爭,只有獲取鎖的線程才能進入就緒狀態
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章