一、什么是線程同步、異步?
白銀區(qū)網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)建站2013年至今到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運(yùn)維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。(更多面試題推薦:java面試題)
同步(synchronous)就是協(xié)同步調(diào),按預(yù)定的先后次序進(jìn)行運(yùn)行。
異步就是和同步相對,不阻塞,同時運(yùn)行。
二、什么是線程不安全?如何解決?(重點(diǎn))
什么叫線程安全?
如果你的代碼所在的進(jìn)程中有多個線程在同時運(yùn)行,而這些線程可能會同時運(yùn)行這段代碼。如果每次運(yùn)行結(jié)果和單線程運(yùn)行的結(jié)果是一樣的,而且其他的變量的值也和預(yù)期的是一樣的,就是線程安全的。
或者說:一個類或者程序所提供的接口對于線程來說是原子操作或者多個線程之間的切換不會導(dǎo)致該接口的執(zhí)行結(jié)果存在二義性,也就是說我們不用考慮同步的問題。
線程安全問題都是由全局變量及靜態(tài)變量引起的。
若每個線程中對全局變量、靜態(tài)變量只有讀操作,而無寫操作,一般來說,這個全局變量是線程安全的;若有多個線程同時執(zhí)行寫操作,一般都需要考慮線程同步,否則就可能影響線程安全。
(相關(guān)教程推薦:java入門程序)
為什么ArrayList線程不安全?不安全為什么要使用?如何解決線程不安全?
一個 ArrayList ,在添加一個元素的時候,它可能會有兩步來完成:
1、在 Items[Size] 的位置存放此元素;
2、增大 Size 的值。
在單線程運(yùn)行的情況下,如果 Size = 0,添加一個元素后,此元素在位置 0,而且 Size=1;而如果是在多線程情況下,比如有兩個線程,線程 A 先將元素存放在位置 0。
但是此時 CPU 調(diào)度線程A暫停,線程 B 得到運(yùn)行的機(jī)會。線程B也向此 ArrayList 添加元素,因為此時 Size 仍然等于 0 (注意哦,我們假設(shè)的是添加一個元素是要兩個步驟哦,而線程A僅僅完成了步驟1),所以線程B也將元素存放在位置0。然后線程A和線程B都繼續(xù)運(yùn)行,都增加 Size 的值。
那好,現(xiàn)在我們來看看 ArrayList 的情況,元素實際上只有一個,存放在位置 0,而 Size 卻等于 2。這就是“線程不安全”了。
如何解決?
加鎖(對象鎖、鎖代碼塊)、自旋+CAS方式(樂觀鎖)、使用java提供的線程安全的數(shù)據(jù)類
三、如何創(chuàng)建一個線程?有幾種方法?
1、繼承Thread類
2、實現(xiàn)Runnable接口
3、實現(xiàn)Callable接口
四、是使用Runnalbe接口好?還是繼承Thread類好?
實現(xiàn)Runnable接口更好一些。
1、因為實現(xiàn)Runnable接口可以避免Java單繼承的局限性。
當(dāng)一個類繼承了Thread,就不可以在繼承其他類了。而當(dāng)一個類實現(xiàn)了Runnable,它一樣可以繼承其他類。
2、更符合面向?qū)ο蟮脑O(shè)計
run()方法的作用是用來封裝線程要運(yùn)行的代碼。那么run()方法所屬的對象,就是線程任務(wù)對象。Thread類的子類對象即使線程對象,又是線程任務(wù)對象。耦合性很強(qiáng)。
有了Runnable接口,可以將線程任務(wù)和線程進(jìn)行解耦,提高了程序的擴(kuò)展性。
(相關(guān)視頻教程推薦:java視頻教程)
五、sleep()和 wait()有什么區(qū)別?
sleep是線程類(Thread)的方法,導(dǎo)致此線程暫停執(zhí)行指定時間,把執(zhí)行機(jī)會給其他線程,但是監(jiān)控狀態(tài)依然保持,到時后會自動恢復(fù)。調(diào)用sleep不會釋放對象鎖。
wait是Object類的方法,對此對象調(diào)用wait方法導(dǎo)致本線程放棄對象鎖,進(jìn)入等待此對象的等待鎖定池,只有針對此對象發(fā)出notify方法(或notifyAll)后本線程才進(jìn)入對象鎖定池準(zhǔn)備獲得對象鎖進(jìn)入運(yùn)行狀態(tài)。
如果變量被聲明為volatile,在每次訪問時都會和主存一致;如果變量在同步方法或者同步塊中 被訪問,當(dāng)在方法或者塊的入口處獲得鎖以及方法或者塊退出時釋放鎖時變量被同步。
本文題目:java經(jīng)典面試題集錦(五)
網(wǎng)頁URL:http://jinyejixie.com/article32/chogpc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、定制開發(fā)、關(guān)鍵詞優(yōu)化、微信公眾號、響應(yīng)式網(wǎng)站、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)