java 同步块 抛出异常_java问题合集(一)
垃圾回收算法
引用計(jì)數(shù)法,標(biāo)記清除法,標(biāo)記壓縮清除法(Java中老年代采用),復(fù)制算法(Java中新生代采用),分代法(Java堆采用),分區(qū)算法。
重要的三句話:
垃圾回收器只知道釋放那些經(jīng)由new分配的內(nèi)存。
1.對象可能不被垃圾回收;
2.垃圾回收并不等于”析構(gòu)”;
3.垃圾回收只能與內(nèi)存有關(guān)。其他補(bǔ)充
棧:后進(jìn)先出
隊(duì)列:先進(jìn)先出
前:中左右? ? ? ? 中:左中右? ? ? 后:左右中
創(chuàng)建執(zhí)行線程的方式:
1.繼承Thread類
2.實(shí)現(xiàn)Runnable接口
3.實(shí)現(xiàn)Callable接口
4.線程池
2/3的區(qū)別:想較于實(shí)現(xiàn)Runnable接口的方式,Callable帶泛型,這個(gè)方法可以有返回值(返回值類型就是泛型指定的),并且可以拋出異常。
執(zhí)行Callable方式,需要FutureTask實(shí)現(xiàn)類的支持,用于接收運(yùn)算結(jié)果,FutureTask是Future接口的實(shí)現(xiàn)類
類和對象:
類是對象具有共同特征和行為的對象的抽象1、String和StringBuffer的區(qū)別?
簡單地說,就是一個(gè)變量和常量的關(guān)系。StringBuffer對象的內(nèi)容可以修改;而String對象一旦產(chǎn)生后就不可以被修改,重新賦值其實(shí)是兩個(gè)對象。
StringBuffer的內(nèi)部實(shí)現(xiàn)方式和String不同,StringBuffer在進(jìn)行字符串處理時(shí),不生成新的對象,在內(nèi)存使用上要優(yōu)于String類。
StringBuffer是線程安全的,在多線程程序中也可以很方便的進(jìn)行使用,但是程序的執(zhí)行效率相對來說就要稍微慢一些。
StringBuffer類中的方法要偏重于對字符串的變化例如追加、插入和刪除等,這個(gè)也是StringBuffer和String類的主要區(qū)別。2、HashMap和Hashtable的區(qū)別?
HashMap和Hashtable都實(shí)現(xiàn)了Map接口,因此很多特性非常相似。但是,他們有以下不同點(diǎn):
補(bǔ)充:HashMap是線程不安全的,Hashtable是線程安全的;Hashtable效率低,因?yàn)椤狧ashtable和HashMap底層都是Hash表,Hashtable有鎖,并且他的鎖是鎖整個(gè)表,(并行轉(zhuǎn)換成了串行);當(dāng)多個(gè)線程并發(fā)去訪問這個(gè)Hashtable時(shí),一次只有一個(gè)進(jìn)入。當(dāng)一個(gè)結(jié)束了才開啟下一個(gè)。效率低。
①、HashMap允許鍵和值是null,而Hashtable不允許鍵或者值是null。
②、Hashtable是同步(synchronization)的,而HashMap不是(這意味著Hashtable是線程安全的,多個(gè)線程可以共享一個(gè)Hashtable;而如果沒有正確的同步的話,多個(gè)線程是不能共享HashMap的;Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴(kuò)展性更好。)。因此,HashMap更適合于單線程環(huán)境,而Hashtable適合于多線程環(huán)境。
③、另一個(gè)區(qū)別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以當(dāng)有其它線程改變了HashMap的結(jié)構(gòu)(增加或者移除元素),將會(huì)拋出ConcurrentModificationException,但迭代器本身的remove()方法移除元素則不會(huì)拋出ConcurrentModificationException異常。但這并不是一個(gè)一定發(fā)生的行為,要看JVM。這條同樣也是Enumeration和Iterator的區(qū)別。
HashMap可以通過下面的語句進(jìn)行同步:Map m = Collections.synchronizeMap(hashMap);3、同步和異步有何異同,在什么情況下分別使用他們?舉例說明。
Java中交互方式分為同步和異步兩種:
同步交互:指發(fā)送一個(gè)請求,需要等待返回,然后才能夠發(fā)送下一個(gè)請求,有個(gè)等待過程;
異步交互:指發(fā)送一個(gè)請求,不需要等待返回,隨時(shí)可以再發(fā)送下一個(gè)請求,即不需要等待。
區(qū)別:一個(gè)需要等待,一個(gè)不需要等待,在部分情況下,我們的項(xiàng)目開發(fā)中都會(huì)優(yōu)先選擇不需要等待的異步交互方式。
哪些情況建議使用同步交互呢?比如銀行的轉(zhuǎn)賬系統(tǒng),對數(shù)據(jù)庫的保存操作等等,都會(huì)使用同步交互操作,其余情況都優(yōu)先使用異步交互。
(如果數(shù)據(jù)將在線程間共享。例如正在寫的數(shù)據(jù)以后可能被另一個(gè)線程讀到,或者正在讀的數(shù)據(jù)可能已經(jīng)被另一個(gè)線程寫過了,那么這些數(shù)據(jù)就是共享數(shù)據(jù),必須進(jìn)行同步存取。
當(dāng)應(yīng)用程序在對象上調(diào)用了一個(gè)需要花費(fèi)很長時(shí)間來執(zhí)行的方法,并且不希望讓程序等待方法的返回時(shí),就應(yīng)該使用異步編程,在很多情況下采用異步途徑往往更有效率。)4、接口是否可繼承接口?抽象類是否可實(shí)現(xiàn)(implements)接口?抽象類是否可繼承實(shí)體類(concrete class)?
接口可以繼承接口。
抽象類可以實(shí)現(xiàn)(implements)接口。
抽象類是否可繼承實(shí)體類,但前提是實(shí)體類必須有明確的構(gòu)造函數(shù)。5、abstract class(抽象類)和interface(接口)有什么區(qū)別?詳細(xì)
1.相同點(diǎn)
A. 兩者都是抽象類,都不能實(shí)例化。
B. interface實(shí)現(xiàn)類及abstrct class的子類都必須要實(shí)現(xiàn)已經(jīng)聲明的抽象方法。
2. 不同點(diǎn)
A. interface需要實(shí)現(xiàn),要用implements,而abstract class需要繼承,要用extends。
B. 一個(gè)類可以實(shí)現(xiàn)多個(gè)interface,但一個(gè)類只能繼承一個(gè)abstract class。
C. interface強(qiáng)調(diào)特定功能的實(shí)現(xiàn),而abstract class強(qiáng)調(diào)所屬關(guān)系。
D. 盡管interface實(shí)現(xiàn)類及abstrct class的子類都必須要實(shí)現(xiàn)相應(yīng)的抽象方法,但實(shí)現(xiàn)的形式不同。interface中的每一個(gè)方法都是抽象方法,都只是聲明的(declaration, 沒有方法體),實(shí)現(xiàn)類必須要實(shí)現(xiàn)。而abstract class的子類可以有選擇地實(shí)現(xiàn)。6、構(gòu)造器Constructor是否可被override?
java 重寫/覆蓋(Override)與重載(Overload)
構(gòu)造器不是方法,那么用來修飾方法特性的所有修飾符都不能用來修飾構(gòu)造器(并不等于構(gòu)造器不具備這些特性,雖然不能用static修飾構(gòu)造器,但它卻有靜態(tài)特性)構(gòu)造器只能用public private protected這三個(gè)權(quán)限修飾符,且不能有返回語句。7、編程題: 寫一個(gè)Singleton出來。
單例模式(Singleton):保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。
餓漢式/懶漢式
上面第二種寫法存在的線程安全問題的解決方法8、數(shù)組有沒有l(wèi)ength()這個(gè)方法? String有沒有l(wèi)ength()這個(gè)方法?
1、數(shù)組有沒有l(wèi)ength()這個(gè)方法? String有沒有l(wèi)ength()這個(gè)方法?
數(shù)組沒有l(wèi)ength()這個(gè)方法,有l(wèi)ength的屬性。String有有l(wèi)ength()這個(gè)方法。
2、是否可以繼承String類?
String類是final類故不可以繼承。
sleep是線程類(Thread)的方法,導(dǎo)致此線程暫停執(zhí)行指定時(shí)間,給執(zhí)行機(jī)會(huì)給其他線程,但是監(jiān)控狀態(tài)依然保持,到時(shí)后會(huì)自動(dòng)恢復(fù)。調(diào)用sleep不會(huì)釋放對象鎖。
wait是Object類的方法,對此對象調(diào)用wait方法導(dǎo)致本線程放棄對象鎖,進(jìn)入等待此對象的等待鎖定池,只有針對此對象發(fā)出notify方法(或notifyAll)后本線程才進(jìn)入對象鎖定池準(zhǔn)備獲得對象鎖進(jìn)入運(yùn)行狀態(tài)。10、java語言如何進(jìn)行異常處理,關(guān)鍵字:throws,throw,try,catch,finally分別代表什么意義?在try塊中可以拋出異常嗎?
throws是獲取異常(用于在方法簽名中聲明拋出一個(gè)或多個(gè)異常類,throws關(guān)鍵字后可以緊跟一個(gè)或多個(gè)異常類。)
throw是拋出異常(用于手動(dòng)地拋出異常對象。throw后面需要一個(gè)異常對象。)
try是將會(huì)發(fā)生異常的語句括起來,從而進(jìn)行異常的處理,
catch是如果有異常就會(huì)執(zhí)行他里面的語句,(catch塊表示一個(gè)異常捕獲塊。當(dāng)程序執(zhí)行try塊引發(fā)異常時(shí),這個(gè)異常對象將會(huì)被后面相應(yīng)的catch塊捕獲。)
而finally不論是否有異常都會(huì)進(jìn)行執(zhí)行的語句。
對于一個(gè)完整的異常處理流程而言,try塊是必須的,try塊后可以緊跟一個(gè)或多個(gè)catch塊,最后還可以帶一個(gè)finally塊。
try塊中可以拋出異常。11、多線程有幾種實(shí)現(xiàn)方法,都是什么?同步有幾種實(shí)現(xiàn)方法,都是什么?
一、多線程實(shí)現(xiàn)方法有兩種 :
①種是實(shí)現(xiàn)Runnable 接口 ②種是繼承Thread類。
二、實(shí)現(xiàn)同步也有兩種 :
①種是用同步方法,②種是用同步塊。
同步方法就是在方法返回類型后面加上synchronized, 比如:
public void * synchronized add(){...}。
同步塊就是直接寫:synchronized (這里寫需要同步的對象){...}
三、
wait():使一個(gè)線程處于等待狀態(tài),并且釋放所持有的對象的lock。
sleep():使一個(gè)正在運(yùn)行的線程處于睡眠狀態(tài),是一個(gè)靜態(tài)方法, * 調(diào)用此方法要捕捉InterruptedException異常 * 。
notify():喚醒一個(gè)處于等待狀態(tài)的線程,注意的是在調(diào)用此方法的時(shí)候,并不能確切的喚醒某一個(gè)等待狀態(tài)的線程 ,而是由JVM確定喚醒哪個(gè)線程,而且不是按優(yōu)先級(jí)? 。
Allnotity():喚醒所有處入等待狀態(tài)的線程,注意并不是給所有喚醒線程一個(gè)對象的鎖,而是讓它們競爭。12、構(gòu)造一個(gè)鏈表類,用堆棧類實(shí)現(xiàn)
13、final,finally,finalize的差別
final 用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
finally是異常處理語句結(jié)構(gòu)的一部分,表示總是執(zhí)行。
finalize是Object類的一個(gè)方法,在垃圾收集器執(zhí)行的時(shí)候會(huì)調(diào)用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時(shí)的其他資源回收,例如關(guān)閉文件等。14、Java異常處理機(jī)制
在 Java 應(yīng)用程序中,異常處理機(jī)制為:拋出異常,捕捉異常。
拋出異常:當(dāng)一個(gè)方法出現(xiàn)錯(cuò)誤引發(fā)異常時(shí),方法創(chuàng)建異常對象并交付運(yùn)行時(shí)系統(tǒng),異常對象中包含了異常類型和異常出現(xiàn)時(shí)的程序狀態(tài)等異常信息。運(yùn)行時(shí)系統(tǒng)負(fù)責(zé)尋找處置異常的代碼并執(zhí)行。
捕獲異常:在方法拋出異常之后,運(yùn)行時(shí)系統(tǒng)將轉(zhuǎn)為尋找合適的異常處理器(exception handler)。潛在的異常處理器是異常發(fā)生時(shí)依次存留在調(diào)用棧中的方法的集合。當(dāng)異常處理器所能處理的異常類型與方法拋出的異常類型相符時(shí),即為合適 的異常處理器。運(yùn)行時(shí)系統(tǒng)從發(fā)生異常的方法開始,依次回查調(diào)用棧中的方法,直至找到含有合適異常處理器的方法并執(zhí)行。當(dāng)運(yùn)行時(shí)系統(tǒng)遍歷調(diào)用棧而未找到合適 的異常處理器,則運(yùn)行時(shí)系統(tǒng)終止。同時(shí),意味著Java程序的終止。15、給定一個(gè)序列,取出其中第二大的數(shù),要求不對整個(gè)序列排序
16、字符串壓縮
總結(jié)
以上是生活随笔為你收集整理的java 同步块 抛出异常_java问题合集(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 多行 n_Java实现向Wor
- 下一篇: java中printarray和sele