Thread類的sleep()方法和對象的wait()方法都可以讓線程暫停執(zhí)行,它們有什么區(qū)別?
sleep()方法(休眠)是線程類(Thread)的靜態(tài)方法撵儿,調(diào)用此方法會讓當前線程暫停執(zhí)行指定的時間,將執(zhí)行機會(CPU)讓給其他線程,但是對象的鎖依然保持,因此休眠時間結(jié)束后會自動恢復间景。wait()是Object類的方法,調(diào)用對象的wait()方法導致當前線程放棄對象的鎖(線程暫停執(zhí)行)艺智,進入對象的等待池(wait pool)倘要,只有調(diào)用對象的notify()方法(或notifyAll()方法)時才能喚醒等待池中的線程進入等鎖池(lock pool),如果線程重新獲得對象的鎖就可以進入就緒狀態(tài).
線程的sleep()方法和yield()方法有什么區(qū)別十拣?
- sleep()方法給其他線程運行機會時不考慮線程的優(yōu)先級封拧,因此會給低優(yōu)先級的線程以運行的機會;yield()方法只會給相同優(yōu)先級或更高優(yōu)先級的線程以運行的機會夭问;
- 線程執(zhí)行sleep()方法后轉(zhuǎn)入阻塞(blocked)狀態(tài)泽西,而執(zhí)行yield()方法后轉(zhuǎn)入就緒(ready)狀態(tài);
- sleep()方法聲明拋出InterruptedException缰趋,而yield()方法沒有聲明任何異常捧杉;
- sleep()方法比yield()方法(跟操作系統(tǒng)CPU調(diào)度相關)具有更好的可移植性
當一個線程進入一個對象的synchronized方法A之后,其它線程是否可進入此對象的synchronized方法B秘血?
不能味抖。其它線程只能訪問該對象的非同步方法,同步方法則不能進入灰粮。因為非靜態(tài)方法上的synchronized修飾符要求執(zhí)行方法時要獲得對象的鎖仔涩,如果已經(jīng)進入A方法說明對象鎖已經(jīng)被取走,那么試圖進入B方法的線程就只能在等鎖池(注意不是等待池哦)中等待對象的鎖粘舟。
請說出與線程同步以及線程調(diào)度相關的方法
- wait():使一個線程處于等待(阻塞)狀態(tài)熔脂,并且釋放所持有的對象的鎖佩研;
- sleep():使一個正在運行的線程處于睡眠狀態(tài),是一個靜態(tài)方法锤悄,調(diào)用此方法要處理InterruptedException異常韧骗;
- notify():喚醒一個處于等待狀態(tài)的線程嘉抒,當然在調(diào)用此方法的時候零聚,并不能確切的喚醒某一個等待狀態(tài)的線程,而是由JVM確定喚醒哪個線程些侍,而且與優(yōu)先級無關隶症;
- notityAll():喚醒所有處于等待狀態(tài)的線程,該方法并不是將對象的鎖給所有線程岗宣,而是讓它們競爭蚂会,只有獲得鎖的線程才能進入就緒狀態(tài);
synchronized關鍵字的用法耗式?
synchronized關鍵字可以將對象或者方法標記為同步胁住,以實現(xiàn)對對象和方法的互斥訪問,可以用synchronized(對象) { … }定義同步代碼塊刊咳,或者在聲明方法時將synchronized作為方法的修飾符彪见。在第60題的例子中已經(jīng)展示了synchronized關鍵字的用法
舉例說明同步和異步
如果系統(tǒng)中存在臨界資源(資源數(shù)量少于競爭資源的線程數(shù)量的資源),例如正在寫的數(shù)據(jù)以后可能被另一個線程讀到娱挨,或者正在讀的數(shù)據(jù)可能已經(jīng)被另一個線程寫過了余指,那么這些數(shù)據(jù)就必須進行同步存取(數(shù)據(jù)庫操作中的排他鎖就是最好的例子)跷坝。當應用程序在對象上調(diào)用了一個需要花費很長時間來執(zhí)行的方法酵镜,并且不希望讓程序等待方法的返回時,就應該使用異步編程柴钻,在很多情況下采用異步途徑往往更有效率淮韭。事實上,所謂的同步就是指阻塞式操作贴届,而異步就是非阻塞式操作缸濒。
啟動一個線程是調(diào)用run()還是start()方法?
啟動一個線程是調(diào)用start()方法粱腻,使線程所代表的虛擬處理機處于可運行狀態(tài)庇配,這意味著它可以由JVM 調(diào)度并執(zhí)行,這并不意味著線程就會立即運行绍些。run()方法是線程啟動后要進行回調(diào)(callback)的方法捞慌。
什么是線程池(thread pool)?
線程池顧名思義就是事先創(chuàng)建若干個可執(zhí)行的線程放入一個池(容器)中柬批,需要的時候從池中獲取線程不用自行創(chuàng)建啸澡,使用完畢不需要銷毀線程而是放回池中袖订,從而減少創(chuàng)建和銷毀線程對象的開銷。
簡述synchronized 和java.util.concurrent.locks.Lock的異同嗅虏?
Lock是Java 5以后引入的新的API洛姑,和關鍵字synchronized相比主要相同點:Lock 能完成synchronized所實現(xiàn)的所有功能;主要不同點:Lock有比synchronized更精確的線程語義和更好的性能皮服,而且不強制性的要求一定要獲得鎖楞艾。synchronized會自動釋放鎖,而Lock一定要求程序員手工釋放龄广,并且最好在finally 塊中釋放(這是釋放外部資源的最好的地方)硫眯。