新聞中心
一、什么是線程同步、異步?
(更多面試題推薦:java面試題)
同步(synchronous)就是協(xié)同步調(diào),按預(yù)定的先后次序進(jìn)行運(yùn)行。
異步就是和同步相對(duì),不阻塞,同時(shí)運(yùn)行。
二、什么是線程不安全?如何解決?(重點(diǎn))
什么叫線程安全?
如果你的代碼所在的進(jìn)程中有多個(gè)線程在同時(shí)運(yùn)行,而這些線程可能會(huì)同時(shí)運(yùn)行這段代碼。如果每次運(yùn)行結(jié)果和單線程運(yùn)行的結(jié)果是一樣的,而且其他的變量的值也和預(yù)期的是一樣的,就是線程安全的。
或者說:一個(gè)類或者程序所提供的接口對(duì)于線程來說是原子操作或者多個(gè)線程之間的切換不會(huì)導(dǎo)致該接口的執(zhí)行結(jié)果存在二義性,也就是說我們不用考慮同步的問題。
線程安全問題都是由全局變量及靜態(tài)變量引起的。
若每個(gè)線程中對(duì)全局變量、靜態(tài)變量只有讀操作,而無寫操作,一般來說,這個(gè)全局變量是線程安全的;若有多個(gè)線程同時(shí)執(zhí)行寫操作,一般都需要考慮線程同步,否則就可能影響線程安全。
(相關(guān)教程推薦:java入門程序)
為什么ArrayList線程不安全?不安全為什么要使用?如何解決線程不安全?
一個(gè) ArrayList ,在添加一個(gè)元素的時(shí)候,它可能會(huì)有兩步來完成:
1、在 Items[Size] 的位置存放此元素;
2、增大 Size 的值。
在單線程運(yùn)行的情況下,如果 Size = 0,添加一個(gè)元素后,此元素在位置 0,而且 Size=1;而如果是在多線程情況下,比如有兩個(gè)線程,線程 A 先將元素存放在位置 0。
但是此時(shí) CPU 調(diào)度線程A暫停,線程 B 得到運(yùn)行的機(jī)會(huì)。線程B也向此 ArrayList 添加元素,因?yàn)榇藭r(shí) Size 仍然等于 0 (注意哦,我們假設(shè)的是添加一個(gè)元素是要兩個(gè)步驟哦,而線程A僅僅完成了步驟1),所以線程B也將元素存放在位置0。然后線程A和線程B都繼續(xù)運(yùn)行,都增加 Size 的值。
那好,現(xiàn)在我們來看看 ArrayList 的情況,元素實(shí)際上只有一個(gè),存放在位置 0,而 Size 卻等于 2。這就是“線程不安全”了。
如何解決?
加鎖(對(duì)象鎖、鎖代碼塊)、自旋+CAS方式(樂觀鎖)、使用java提供的線程安全的數(shù)據(jù)類
三、如何創(chuàng)建一個(gè)線程?有幾種方法?
1、繼承Thread類
2、實(shí)現(xiàn)Runnable接口
3、實(shí)現(xiàn)Callable接口
四、是使用Runnalbe接口好?還是繼承Thread類好?
實(shí)現(xiàn)Runnable接口更好一些。
1、因?yàn)閷?shí)現(xiàn)Runnable接口可以避免Java單繼承的局限性。
當(dāng)一個(gè)類繼承了Thread,就不可以在繼承其他類了。而當(dāng)一個(gè)類實(shí)現(xiàn)了Runnable,它一樣可以繼承其他類。
2、更符合面向?qū)ο蟮脑O(shè)計(jì)
run()方法的作用是用來封裝線程要運(yùn)行的代碼。那么run()方法所屬的對(duì)象,就是線程任務(wù)對(duì)象。Thread類的子類對(duì)象即使線程對(duì)象,又是線程任務(wù)對(duì)象。耦合性很強(qiáng)。
有了Runnable接口,可以將線程任務(wù)和線程進(jìn)行解耦,提高了程序的擴(kuò)展性。
(相關(guān)視頻教程推薦:java視頻教程)
五、sleep()和 wait()有什么區(qū)別?
sleep是線程類(Thread)的方法,導(dǎo)致此線程暫停執(zhí)行指定時(shí)間,把執(zhí)行機(jī)會(huì)給其他線程,但是監(jiān)控狀態(tài)依然保持,到時(shí)后會(huì)自動(dòng)恢復(fù)。調(diào)用sleep不會(huì)釋放對(duì)象鎖。
wait是Object類的方法,對(duì)此對(duì)象調(diào)用wait方法導(dǎo)致本線程放棄對(duì)象鎖,進(jìn)入等待此對(duì)象的等待鎖定池,只有針對(duì)此對(duì)象發(fā)出notify方法(或notifyAll)后本線程才進(jìn)入對(duì)象鎖定池準(zhǔn)備獲得對(duì)象鎖進(jìn)入運(yùn)行狀態(tài)。
如果變量被聲明為volatile,在每次訪問時(shí)都會(huì)和主存一致;如果變量在同步方法或者同步塊中 被訪問,當(dāng)在方法或者塊的入口處獲得鎖以及方法或者塊退出時(shí)釋放鎖時(shí)變量被同步。
分享題目:java經(jīng)典面試題集錦(五)
文章網(wǎng)址:http://www.dlmjj.cn/article/chogpc.html