版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1forword和redirect的區(qū)別以及各自的應用場景直接轉(zhuǎn)發(fā)方式(Forward),客戶端和瀏覽器只發(fā)出一次請求,Servlet、HTML、JSP或其它信息資源,由第二個信息資源響應該請求,在請求對象request中,保存的對象對于一個每個信息資源是共享的。場景:Web應用程序大多會有一個控制器。由控制器來控制請求應該轉(zhuǎn)發(fā)給那個信息資源。然后由這些信息資源處理請求,處理完以后還可能轉(zhuǎn)發(fā)給另外的信息資源來返回給用戶,這個過程就是經(jīng)典的MVC模式。間接轉(zhuǎn)發(fā)方式(Redirect)實際是兩次HTTP請求,服務器端在響應第一次請求的時候,讓瀏覽器再向另外一個URL發(fā)出請求,從而達到轉(zhuǎn)發(fā)的目的。場景:一般用于避免用戶的非正常訪問。例如:用戶在沒有登錄的情況下訪問后臺資源,Servlet可以將該HTTP請求重定向到登錄頁面,讓用戶登錄以后再訪問。區(qū)別Forward和Redirect代表了兩種請求轉(zhuǎn)發(fā)方式:直接轉(zhuǎn)發(fā)和間接轉(zhuǎn)發(fā)。對應到代碼里,分別是RequestDispatcher類的forward()方法和HttpServletRequest類的sendRedirect()方法。對于間接方式,服務器端在響應第一次請求的時候,讓瀏覽器再向另外一個URL發(fā)出請求,從而達到轉(zhuǎn)發(fā)的目的。它本質(zhì)上是兩次HTTP請求,對應兩個request對象。對于直接方式,客戶端瀏覽器只發(fā)出一次請求,Servlet把請求轉(zhuǎn)發(fā)給Servlet、HTML、JSP或其它信息資源,由第2個信息資源響應該請求,兩個信息資源共享同一個request對象。2Spring套餐描述Spring容器初始化過程Ioc容器的初始化是由refresh()方法來啟動的,這個方法標志著Ioc容器的正式啟動。具體來說這個啟動過程包括三個基本過程:1>.BeanDifinition的Resource定位指的是BeanDifinition的資源定位,它由ResourceLoader通過統(tǒng)一的Resource接口來完成,這些 BeanDifinition的存在形式,比如,在文件系統(tǒng)中的Bean定義信息可以使用FileSystemResource來進行 抽象,在類路徑中的Bean定義信息可以使用ClassPathResource。2>.BeanDifinition的載入與解析把用戶定義好的Bean表示成Ioc容器內(nèi)部的數(shù)據(jù)結(jié)構(gòu),而這個容器內(nèi)部的數(shù)據(jù)結(jié)構(gòu)就是BeanDifinition。具體來說,BeanDifinition實際上就是POJO對象在IOC容器中的抽象,通過這個BeanDifinition定義的數(shù)據(jù)結(jié)構(gòu),使IOC容器能夠方便的對POJO對象也就是Bean進行管理。3>.BeanDifinition在Ioc容器中的注冊這個操作是通過調(diào)用BeanDifinitionRegistry借口來實現(xiàn)的。這個注冊過程把載入過程中解析得到的BeanDifinition向Ioc容器進行注冊。在閱讀源碼中可知,在IOC容器內(nèi)部將BeanDifinition注入到一個HashMap中去,Ioc容器就是通過這個HashMap來持有這些BeanDifinition數(shù)據(jù)的。2、為什么要進行事務管理,Spring是如何進行事務管理支持的Spring事務是
Spring
AOP
的一種實現(xiàn),本質(zhì)是基于動態(tài)代理技術(shù)對所需要管理的bean進行加載,并在方法調(diào)用前后加入合適的事務管理代碼實現(xiàn)事務的提交與產(chǎn)生異常時回滾。spring的事務聲明有兩種方式,編程式和聲明式。spring主要是通過“聲明式事務”的方式對事務進行管理,即在配置文件中進行聲明,通過AOP將事務切面切入程序,最大的好處是大大減少了代碼量。Spring如何配置數(shù)據(jù)庫驅(qū)動<bean
id="dataSource"class="mons.dbcp.BasicDataSource"><property
name="driverClassName"value="com.mysql.jdbc.Driver"></property><property
name="url"value="jdbc:mysql://localhost:3306/test"></property><property
name="username"
value="root"></property><property
name="password"
value="admin"></property></bean>解釋一下DI依賴注入和IOC控制反轉(zhuǎn),Spring中是如何做的
IOC(控制反轉(zhuǎn))是spring的核心,由Spring管理創(chuàng)建響應的對象,即由IOC容器幫對象管理響應的依賴關(guān)系,并在運行時將對象注入,而不是通過傳統(tǒng)的new來主動創(chuàng)建對象。而DI則是實現(xiàn)IOC注入關(guān)聯(lián)對象的方式,有三種:set方法注入、構(gòu)造函數(shù)注入和參數(shù) (常量)注入??刂品崔D(zhuǎn)和依賴注入是同一個東西在不同的角度進行分析,在實際項目開發(fā)中我們需要把bean都放在spring中管理,告訴spring不同bean之間的依賴關(guān)系,而具體的創(chuàng)建注入都是由spring容器幫我們實現(xiàn)的,即通過控制反轉(zhuǎn)和依賴注入,本質(zhì)實現(xiàn)都是基于反射機制來實現(xiàn)的。Spring中的BeanFactory與ApplicationContext的作用有那些BeanFactory提供了配制框架及基本功能,負責對象實例化、定位、配置應用程序中的對象及建立這些對象間的依賴。而ApplicationContext則增加了更多支持企業(yè)核心內(nèi)容的功 能。比如更易與SpringAOP集成、消息資源處理(國際化處理)、事件傳遞及各種不同應用層的context實現(xiàn)(如針對web應用的WebApplicationContext)。Spring中的核心類有那些,各有什么作用BeanFactory:產(chǎn)生一個新的實例,可以實現(xiàn)單例模式BeanWrapper:提供統(tǒng)一的get及set方法ApplicationContext:提供框架的實現(xiàn),包括BeanFactory的所有功能什么是aop,aop的作用是什么面向切面編程,或AOP允許程序員模塊化橫向業(yè)務邏輯,將系統(tǒng)中非核心的業(yè)務提取出來,進行單獨處理,解決系統(tǒng)代碼耦合度過高的問題。使代碼重用度高、易于維護。例如權(quán)限認證、日志管理和事務管理。springbean的創(chuàng)建方式和生命周期三種創(chuàng)建方式:①構(gòu)造器注入創(chuàng)建②工廠方法(靜態(tài)工廠)③工廠類(實例工廠)1)Bean實例化:Bean的默認構(gòu)造函數(shù)。2)Bean的初始化:Init()方法中可以進行初始化。3)Bean的使用:getBean()方法可以獲取當前的Bean,從而做相對應的業(yè)務操作。4)Bean的銷毀:destroy()方法執(zhí)行bean的銷毀。9、spring與springMVC的區(qū)別Spring是一個輕量級的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架。springmvc類似于struts的一個MVC開框架,其實都是屬于spring,springmvc需要有spring的架包作為支撐才能跑起來。3HashMap(或者Hashtable/ArrayList。。。)的數(shù)據(jù)結(jié)構(gòu)(實現(xiàn)方式)HashMap:key:value底層使用數(shù)組(table)+鏈表(entry)結(jié)構(gòu),通過key進行二次hash計算出的hashCode%table.length確定對應的數(shù)組下標的位置存放value。HashTable:key:valueHashtable
繼承于Dictionary,實現(xiàn)了Map、Cloneable、Java.io.Serializable接口,Hashtable的函數(shù)都是同步的,這意味著它是線程安全的。它的key、value都不可以為null。此外,Hashtable中的映射不是有序的。底層使用數(shù)組(table)+鏈表(entry)結(jié)構(gòu),hash計算方法是直接使用key的hashcode對table數(shù)組的長度直接進行取模。ArrayList:線性鏈表(線程不安全),最核心的兩個成員變量是存儲數(shù)據(jù)的數(shù)組和數(shù)組大小。a.ArrayList是通過將底層Object數(shù)組復制的方式(System.arraycopy方法)來處理數(shù)組的增長;
b.當ArrayList的容量不足時,其擴充容量的方式:先將容量擴充至當前容量的1.5倍,若還不夠,則將容量擴充至當前需要的數(shù)量。4GET與POST的區(qū)別,分別用在什么場景合適?GET一般用于獲取/查詢資源信息,而POST一般用于更新資源信息。get是把參數(shù)數(shù)據(jù)隊列加到提交表單的ACTION屬性所指的URL中,值和表單內(nèi)各個字段一一對應,在URL中可以看到。post是通過HTTPpost機制,將表單內(nèi)各個字段與其內(nèi)容放置在HTMLHEADER內(nèi)一起傳送到ACTION屬性所指的URL地址。用戶看不到這個過程。對于get方式,服務器端用doGet獲取變量的值,對于post方式,服務器端用doPost獲取提交的數(shù)據(jù)。get傳送的數(shù)據(jù)量較小,不能大于2KB。post傳送的數(shù)據(jù)量較大,一般被默認為不受限制。get安全性非常低,post安全性較高。但是執(zhí)行效率卻比Post方法好。5什么是單例模式,有哪些實現(xiàn)方式,寫出其中兩種Singleton是一種創(chuàng)建型模式,指某個類采用Singleton模式,則在這個類被創(chuàng)建后,只可能產(chǎn)生一個實例供外部訪問,并且提供一個全局的訪問點。第一種(懶漢,線程不安全):略(參考第二種)第二種(懶漢,線程安全):
public
class
Singleton
{
private
static
Singleton
instance;
private
Singleton
(){}
public
static
synchronized
Singleton
getInstance()
{
if
(instance
==
null)
{
instance
=
new
Singleton();
}
return
instance;
}
}
這種寫法能夠在多線程中很好的工作,而且看起來它也具備很好的lazyloading,但是,遺憾的是,效率很低,99%情況下不需要同步。第三種(餓漢):
public
class
Singleton
{
private
static
Singleton
instance
=
new
Singleton();
private
Singleton
(){}
public
static
Singleton
getInstance()
{
return
instance;
}
}
第四種(靜態(tài)內(nèi)部類):
public
class
Singleton
{
private
static
class
SingletonHolder
{
private
static
final
Singleton
INSTANCE
=
new
Singleton();
}
private
Singleton
(){}
public
static
final
Singleton
getInstance()
{
return
SingletonHolder.INSTANCE;
}
}
這種方式同樣利用了classloder的機制來保證初始化instance時只有一個線程,它跟第三種方式不同的是(很細微的差別):第三種是只要Singleton類被裝載了,那么instance就會被實例化(沒有達到lazyloading效果),而這種方式是Singleton類被裝載了,instance不一定被初始化。因為SingletonHolder類沒有被主動使用,只有顯示通過調(diào)用getInstance方法時,才會顯示裝載SingletonHolder類,從而實例化instance。想象一下,如果實例化instance很消耗資源,我想讓他延遲加載,另外一方面,我不希望在Singleton類加載時就實例化,因為我不能確保Singleton類還可能在其他的地方被主動使用從而被加載,那么這個時候?qū)嵗痠nstance顯然是不合適的。這個時候,這種方式相比第三方式就顯得很合理。第五種(枚舉):
public
enum
Singleton
{
INSTANCE;
public
void
instance()
{
}
}
這種方式是EffectiveJava作者JoshBloch提倡的方式,它不僅能避免多線程同步問題,而且還能防止反序列化重新創(chuàng)建新的對象,可謂是很堅強的壁壘啊,不過,個人認為由于1.5中才加入enum特性,用這種方式寫不免讓人感覺生疏,在實際工作中,我也很少看見有人這么寫過。第六種(雙重校驗鎖):
public
class
Singleton
{
private
volatile
static
Singleton
singleton;
private
Singleton
(){}
public
static
Singleton
getSingleton()
{
if
(singleton
==
null)
{
synchronized
(Singleton.class)
{
if
(singleton
==
null)
{
singleton
=
new
Singleton();
}
}
}
return
singleton;
}
}
這個是第二種方式的升級版,俗稱雙重檢查鎖定,但僅在JDK1.5之后有效。6常見的設(shè)計模式有哪些,并寫出簡單的示例代碼單例模式(略):工廠模式(普通、多方法和靜態(tài)工廠方法、抽象工廠):該模式主要功能是統(tǒng)一提供實例對象的引用建造者模式:一個對象的組成可能有很多其他的對象一起組成的,比如說,一個對象的實現(xiàn)非常復雜,有很多的屬性,而這些屬性又是其他對象的引用,可能這些對象的引用又包括很多的對象引用。封裝這些復雜性,就可以使用建造模式。策略模式:這個模式是將行為的抽象,即當有幾個類有相似的方法,將其中通用的部分都提取出來,從而使擴展更容易。門面模式:這個模式個人感覺像是Service層的一個翻版。比如Dao我們定義了很多持久化方法,我們通過Service層將Dao的原子方法組成業(yè)務邏輯,再通過方法向上層提供服務。門面模式道理其實是一樣的。代理模式:其實每個模式名稱就表明了該模式的作用,代理模式就是多一個代理類出來,替原對象進行一些操作,比如我們在租房子的時候回去找中介,為什么呢?因為你對該地區(qū)房屋的信息掌握的不夠全面,希望找一個更熟悉的人去幫你做,此處的代理就是這個意思。7原生JS的繼承是怎么實現(xiàn)的,都有哪幾種?①對象冒充functionParent(username){...}functionChild(username,password){//第一步:this.method是作為一個臨時的屬性,并且指向Parent所指向的對象,this.method=Parent;//第二步:執(zhí)行this.method方法,即執(zhí)行Parent所指向的對象函數(shù)this.method(username);//最關(guān)鍵的一行//第三步:銷毀this.method屬性,即此時Child就已經(jīng)擁有了Parent的所有屬性和方法deletethis.method;...}②call方法call方法是Function類中的方法call方法的第一個參數(shù)的值賦值給類(即方法)中出現(xiàn)的thiscall方法的第二個參數(shù)開始依次賦值給類(即方法)所接受的參數(shù)functionParent(username){...}functionChild(username,password){Parent.call(this,username);...}③apply()方法方式
apply方法接受2個參數(shù),
A、第一個參數(shù)與call方法的第一個參數(shù)一樣,即賦值給類(即方法)中出現(xiàn)的this
B、第二個參數(shù)為數(shù)組類型,這個數(shù)組中的每個元素依次賦值給類(即方法)所接受的參數(shù)functionParent(username){...}functionChild(username,password){Parent.apply(this,newArray(username));...}④原型鏈方式,即子類通過prototype將所有在父類中通過prototype追加的屬性和方法都追加到Child,從而實現(xiàn)了繼承。functionPerson(){}Ptotype.hello="hello";Ptotype.sayHello=function(){alert(this.hello);}functionChild(){}
Ctotype=newPerson();//這行的作用是:將Parent中將所有通過prototype追加的屬性和方法都追加到Child,從而實現(xiàn)了繼承
Ctotype.world="world";
Ctotype.sayWorld=function(){alert(this.world);}⑤混合方式(略):混合了call方式、原型鏈方式8數(shù)據(jù)庫優(yōu)化方式有哪些?(下面是可能會連貫性問到的問題)MySQL和Oracle的區(qū)別,在什么情況下更適合?MySQL開源免費,適合中小型應用系統(tǒng),ORACLE龐大健全用于大型應用系統(tǒng)和安全性要求較高的領(lǐng)域。使用細節(jié)也有些區(qū)別,例如:①mysql中組函數(shù)在select語句中可以隨意使用,但在oracle中如果查詢語句中有組函數(shù),那其他列名必須是組函數(shù)處理過的,或者是groupby子句中的列否則報錯selectname,count(money)fromuser;這個放在mysql中沒有問題在oracle中就有問題了。②自動增長列的實現(xiàn)MYSQL有自動增長的數(shù)據(jù)類型,插入記錄時不用操作此字段,會自動獲得數(shù)據(jù)值。ORACLE沒有自動增長的數(shù)據(jù)類型,需要建立一個自動增長的序列號,插入記錄時要把序列號的下一個值賦于此字段。③單引號處理MYSQL里可以用雙引號包起字符串,ORACLE里只可以用單引號包起字符串。④分頁處理MYSQL使用limit即可,ORACLE必須使用三層子查詢結(jié)合ROWNUM實現(xiàn)⑤日期字段MYSQL日期字段分DATE和TIME兩種,ORACLE日期字段只有DATE,包含年月日時分秒信息,用當前數(shù)據(jù)庫的系統(tǒng)時間為SYSDATE,精確到秒。⑥空字符串MYSQL的非空字段也有空的內(nèi)容,ORACLE里定義了非空字段就不容許有空的內(nèi)容。按MYSQL的NOTNULL來定義ORACLE表結(jié)構(gòu),導數(shù)據(jù)的時候會產(chǎn)生錯誤。因此導數(shù)據(jù)時要對空字符進行判斷,如果為NULL或空字符,需要把它改成一個空格的字符串。MySQL的性能方面你了解多少?比如一個正常的讀寫操作你覺得多少時間算是正常?服務器12核24線程,64G內(nèi)存,SATA盤的情況下:讀1.5~3W/s,寫4000~10000/s,TPS800~1500/s。,平均響應10ms以內(nèi)正常。如果一張表的查詢速度慢了.你會從哪些方面去優(yōu)化?①慢查詢定位及改進:Show命令、慢查詢?nèi)罩尽xplain分析查詢、profiling分析②索引優(yōu)化合理建立索引、優(yōu)化索引相關(guān)的查詢SQL1>.
當結(jié)果集只有一行數(shù)據(jù)時使用LIMIT12>.
避免SELECT*,始終指定你需要的列3>.
使用連接(JOIN)來代替子查詢(Sub-Queries)4>.
使用合理的字段屬性長度5>.
盡可能的使用NOTNULL6>.
固定長度的表會更快7>.
拆分大的DELETE
或INSERT
語句8>.
查詢的列越小越快有些where條件會導致索引無效:?
where子句的查詢條件里有!=,MySQL將無法使用索引。?
where子句使用了Mysql函數(shù)的時候,索引將無效?
使用LIKE進行搜索匹配的時候,模糊匹配不能放在前面,否則失效。如’%xxxx’③配置優(yōu)化MySQL服務器全局參數(shù)優(yōu)化④分表(橫、縱)減少單表的數(shù)據(jù)量及將常用列和不常用列、大列和小列分到不同的表。你做的三個項目里應該都會用到權(quán)限設(shè)計,你對表是怎么設(shè)計的?按照RBAC權(quán)限體系設(shè)計通用的權(quán)限管理表你們對表的設(shè)計怎么優(yōu)化?你覺得一張表裝多少行數(shù)據(jù)才會影響性能?數(shù)據(jù)類型:數(shù)字類型盡量不選擇double、float,盡量使用decimal、int和long類型。字符類型除非非得是TEXT,而要盡量使用CHAR和VARCHAR。日期時間類型盡量使用TIMESTAMP,對于精確到某天的日期類型盡量選擇DATE。盡量不使用BLOB/CLOB等LOB類型。適當拆分:縱向分表適度冗余:空間換時間,將常用的需要連接查詢的數(shù)據(jù)放到主表。不過,冗余的同時需要確保數(shù)據(jù)的一致性不會遭到破壞,確保更新的同時冗余字段也被更新。避免NULL:NULL類型比較特殊,SQL難優(yōu)化。雖然MySQLNULL類型和Oracle的NULL有差異,會進入索引中,但如果是一個組合索引,那么這個NULL類型的字段會極大影響整個索引的效率。此外,NULL在索引中的處理也是特殊的,也會占用額外的存放空間。Mysql單表如果數(shù)據(jù)結(jié)構(gòu)簡單2000W以下幾乎可以支撐,如果復雜的數(shù)據(jù)結(jié)構(gòu)500W既可以考慮分表,一般而言如果單表超過5000W,那么性能下降比較厲害。數(shù)據(jù)庫最基本,最常用的優(yōu)化是什么?表結(jié)構(gòu)優(yōu)化:正確的數(shù)據(jù)類型選擇、橫向/縱向分表、建立索引、刪除不必要的字段、適度冗余索引優(yōu)化:主鍵索引、獨立索引、聯(lián)合索引SQL語句優(yōu)化:盡量使用索引、盡量不對條件左邊的對象進行運算(包括函數(shù)運算)、盡量不使用(!=/<>/not/or)等,可用union代替betweenand區(qū)間的取值、盡量使用exists代替in、使用like時盡量使用左匹配’key%’、一般表連接比子查詢更快存儲過程:利用存儲過程完成復雜且傳輸數(shù)據(jù)量大的邏輯。數(shù)據(jù)庫儲存引擎myisam/innodb的區(qū)別①MyISAM不支持事務,而InnoDB支持②InnoDB支持數(shù)據(jù)行鎖定,MyISAM不支持行鎖定,只支持鎖定整個表③InnoDB支持外鍵,MyISAM不支持④InnoDB的主鍵范圍更大,最大是MyISAM的2倍。⑤InnoDB不支持全文索引和GIS數(shù)據(jù),而MyISAM支持。⑥MyISAM磁盤上是3個文件,.frm文件存儲表定義。數(shù)據(jù)文件的擴展名為.MYD(MYData)。索引文件的擴展名是.MYI(MYIndex)。InnoDB:所有的表都保存在同一個數(shù)據(jù)文件中(也可能是多個文件,或者是獨立的表空間文件),InnoDB表的大小只受限于操作系統(tǒng)文件的大小,一般為2GB。⑦MyISAM:可被壓縮,存儲空間較小。支持三種不同的存儲格式:靜態(tài)表(默認,但是注意數(shù)據(jù)末尾不能有空格,會被去掉)、動態(tài)表、壓縮表。InnoDB:需要更多的內(nèi)存和存儲,它會在主內(nèi)存中建立其專用的緩沖池用于高速緩沖數(shù)據(jù)和索引。模糊查詢可以使用索引嗎?可以,但必須是左匹配’key%’索引的優(yōu)缺點優(yōu)點:加快查詢效率和表連接的效率、減少分組和排序時間。缺點:創(chuàng)建和更新索引需要耗費時間,隨著數(shù)據(jù)量的增加而增加。索引會額外占用磁盤存儲空間。9java中4種修飾符分別為public、protect、default、private的區(qū)別修飾符同類同包子類公共private(私有)√默認不寫√√protected(受保護)√√√public(公共)√√√√主要是修飾類中的成員(字段、方法、構(gòu)造方法,內(nèi)部類); public默認不寫:可以修飾類 privateprotedted:不能夠修飾類(外部類)10介紹一下Hibernate的緩存機制(或者問:二級緩存)Hibernate中的緩存分一級緩存和二級緩存。一級緩存就是Session級別的緩存,在事務范圍內(nèi)有效是,內(nèi)置的不能被卸載。二級緩存是SesionFactory級別的緩存,從應用啟動到應用結(jié)束有效。是可選的,默認沒有二級緩存,需要手動開啟。保存數(shù)據(jù)庫后,在內(nèi)存中保存一份,如果更新了數(shù)據(jù)庫就要同步更新。什么樣的數(shù)據(jù)適合存放到第二級緩存中?1)很少被修改的數(shù)據(jù)帖子的最后回復時間2)經(jīng)常被查詢的數(shù)據(jù)電商的地點2)不是很重要的數(shù)據(jù),允許出現(xiàn)偶爾并發(fā)的數(shù)據(jù)3)不會被并發(fā)訪問的數(shù)據(jù)4)常量數(shù)據(jù)擴展:hibernate的二級緩存默認是不支持分布式緩存的。使用memcahe,redis等中央緩存來代替二級緩存。11說說你日常用到存儲過程與觸發(fā)器的場景觸發(fā)器:①實施復雜的安全性檢查(例如:禁止在非工作時間插入新員工數(shù)據(jù))②數(shù)據(jù)確認或?qū)徲嫞ɡ纾簼q薪水,漲后的薪水不能小于漲前)③數(shù)據(jù)備份與同步(給更新員工信息后自動備份新信息到備份表,或更新和員工相關(guān)連的冗余信息)存儲過程:定時性的ETL任務、報表統(tǒng)計函數(shù)及復雜業(yè)務(大量SQL及大數(shù)據(jù)量傳輸)可以采用存儲過程處理,另外涉及到算法或數(shù)據(jù)保密的情況也可以將保密邏輯及數(shù)據(jù)放到存儲過程中計算完成,程序只關(guān)注傳入?yún)?shù)及返回結(jié)果。12String,StringBuffer,StringBuilder的區(qū)別String(JDK1.0時代)
不可變字符序列StringBuffer(JDK1.0時代)
線程安全的可變字符序列StringBuilder(JDK1.5時代)
非線程安全的可變字符序列
①String和StringBuffer中的value[]都用于存儲字符序列,String中的是常量(final)數(shù)組,只能被賦值一次。StringBuffer中的value[]就是一個很普通的數(shù)組,而且可以通過append()方法將新字符串加入value[]末尾。②StringBuffer線程安全,而StringBuilder不是。③StringBuilder的效率比StringBuffer稍高,如果不考慮線程安全,StringBuilder應該是首選。④StringBuffer對象的append效率要高于String對象的"+"連接操作。13int與Integer的區(qū)別①int是基本數(shù)據(jù)類型,Integer是其包裝類,注意是一個類。②Integer默認值是null,而int默認值是0;③聲明為Integer的變量需要實例化,而聲明為int的變量不需要實例化;④Integer是對象,用一個引用指向這個對象,而int是基本類型,直接存儲數(shù)值。14如何實現(xiàn)序列化,有什么意義,適用于那些場景?(追問:序列化接口在JVM是怎么實現(xiàn)的)序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內(nèi)容進行流化。可以對流化后的對象進行讀寫操作,也可將流化后的對象傳輸于網(wǎng)絡之間。序列化是為了解決對象流讀寫操作時可能引發(fā)的問題(如果不進行序列化可能會存在數(shù)據(jù)亂序的問題)。要實現(xiàn)序列化,需要讓一個類實現(xiàn)Serializable接口,該接口是一個標識性接口,標注該類對象是可被序列化的,然后使用一個輸出流來構(gòu)造一個對象輸出流并通過writeObject(Object)方法就可以將實現(xiàn)對象寫出(即保存其狀態(tài));如果需要反序列化則可以用一個輸入流建立對象輸入流,然后通過readObject方法從流中讀取對象。序列化除了能夠?qū)崿F(xiàn)對象的持久化之外,還能夠用于對象的深度克隆。只有實現(xiàn)了serializable和Externalizable接口的類的對象才能被序列化
后者是前者的子類
實現(xiàn)這個借口的類完全由自身來控制序列化的行為,而僅僅實現(xiàn)前者的類可以采用默認的序列化方式。實現(xiàn)這兩個接口標志著對象可以被序列化了Java
串行化技術(shù)可以使你將一個對象的狀態(tài)寫入一個Byte
流里,并且可以從其它地方把該Byte
流里的數(shù)據(jù)讀出來,重新構(gòu)造一個相同的對象。這種機制允許你將對象通過網(wǎng)絡進行傳播,并可以隨時把對象持久化到數(shù)據(jù)庫、文件等系統(tǒng)里。Java的串行化機制是RMI、EJB等技術(shù)的技術(shù)基礎(chǔ)。用途:利用對象的串行化實現(xiàn)保存應用程序的當前工作狀態(tài),下次再啟動的時候?qū)⒆詣拥鼗謴偷缴洗螆?zhí)行的狀態(tài)。15JDBC連接數(shù)據(jù)庫的步驟①加載數(shù)據(jù)庫驅(qū)動Class.forName("com.mysql.jdbc.Driver");②創(chuàng)建數(shù)據(jù)庫連接Connectioncon=DriverManager.getConnection(url,username,password);③創(chuàng)建一個Statement1、執(zhí)行靜態(tài)SQL語句。通常通過Statement實例實現(xiàn)。2、執(zhí)行動態(tài)SQL語句。通常通過PreparedStatement實例實現(xiàn)。3、執(zhí)行數(shù)據(jù)庫存儲過程。通常通過CallableStatement實例實現(xiàn)。④執(zhí)行SQL語句Statement接口提供了三種執(zhí)行SQL語句的方法:executeQuery、executeUpdate和execute方法。⑤處理結(jié)果ResultSet⑥關(guān)閉JDBC對象關(guān)閉記錄集ResultSet、聲明Statement和連接Connection16Mybatis中#{...}和${...}的區(qū)別#{}語法,MyBatis會產(chǎn)生PreparedStatement語句中,并且安全的設(shè)置PreparedStatement參數(shù),這個過程中MyBatis會進行必要的安全檢查和轉(zhuǎn)義。${}是直接輸出變量的值,未經(jīng)過預編譯的,僅僅是取變量的值,是非安全的,存在sql注入.盡量使用#,但是${}在什么情況下使用呢?有時候可能需要直接插入一個不做任何修改的字符串到SQL語句中。這時候應該使用${}語法。比如,動態(tài)SQL中的字段名,如:ORDERBY${columnName}17什么是樂觀鎖,什么是悲觀鎖,兩者的區(qū)別是什么悲觀鎖:假定會發(fā)生并發(fā)沖突,屏蔽一切可能違反數(shù)據(jù)完整性的操作。開始改變對象時鎖住直到完成所有操作后才釋放。樂觀鎖:假設(shè)不會發(fā)生并發(fā)沖突,只在提交操作時檢查是否違反數(shù)據(jù)完整性。修改過程不鎖定對象,直到提交所做更改時才將對象鎖住。讀取時不加鎖,因此可能會造成臟讀。樂觀鎖的實現(xiàn)方式①使用自增長的整數(shù)表示數(shù)據(jù)版本號。更新時檢查版本號是否一致,比如數(shù)據(jù)庫中數(shù)據(jù)版本為6,更新提交時version=6+1,使用該version值(=7)與數(shù)據(jù)庫version+1(=7)作比較,如果相等,則可以更新,如果不等則有可能其他程序已更新該記錄,所以返回錯誤。②使用時間戳來實現(xiàn).注:對于以上兩種方式,Hibernate自帶實現(xiàn)方式:在使用樂觀鎖的字段前加annotation:@Version,Hibernate在更新時自動校驗該字段。在實際生產(chǎn)環(huán)境里邊,如果并發(fā)量不大且不允許臟讀,可以使用悲觀鎖解決并發(fā)問題;但如果系統(tǒng)的并發(fā)非常大的話,悲觀鎖定會帶來非常大的性能問題,所以我們就要選擇樂觀鎖定的方法.18VectorArrayListLinkedList的區(qū)別這三者都實現(xiàn)了List接口.所有使用方式也很相似,主要區(qū)別在于因為實現(xiàn)方式的不同,所以對不同的操作具有不同的效率。ArrayList是一個可改變大小的數(shù)組.當更多的元素加入到ArrayList中時,其大小將會動態(tài)地增長.內(nèi)部的元素可以直接通過get與set方法進行訪問,因為ArrayList本質(zhì)上就是一個數(shù)組.LinkedList是一個雙鏈表,在添加和刪除元素時具有比ArrayList更好的性能.但在get與set方面弱于ArrayList.當然,這些對比都是指數(shù)據(jù)量很大或者操作很頻繁的情況下的對比,如果數(shù)據(jù)和運算量很小,那么對比將失去意義.Vector和ArrayList類似,但屬于強同步類。如果你的程序本身是線程安全的(thread-safe,沒有在多個線程之間共享同一個集合/對象),那么使用ArrayList是更好的選擇。Vector和ArrayList在更多元素添加進來時會請求更大的空間。Vector每次請求其大小的雙倍空間,而ArrayList每次對size增長50%.而LinkedList還實現(xiàn)了Queue接口,該接口比List提供了更多的方法,包括offer(),peek(),poll()等.注意:默認情況下ArrayList的初始容量非常小,所以如果可以預估數(shù)據(jù)量的話,分配一個較大的初始值屬于最佳實踐,這樣可以減少調(diào)整大小的開銷。19HashtableHashMapTreeMap的區(qū)別
Hashmap是一個最常用的Map,它根據(jù)鍵的HashCode值存儲數(shù)據(jù),根據(jù)鍵可以直接獲取它的值,具有很快的訪問速度。HashMap最多只允許一條記錄的鍵為Null;允許多條記錄的值為Null;HashMap不支持線程的同步,即任一時刻可以有多個線程同時寫HashMap;可能會導致數(shù)據(jù)的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力.
Hashtable與HashMap類似,但是主要有6點不同。
1.HashTable的方法是同步的,HashMap未經(jīng)同步,所以在多線程場合要手動同步HashMap這個區(qū)別就像Vector和ArrayList一樣。
2.HashTable不允許null值,key和value都不可以,HashMap允許null值,key和value都可以。HashMap允許key值只能由一個null值,因為hashmap如果key值相同,新的key,
value將替代舊的。
3.HashTable有一個contains(Object
value)功能和containsValue(Object
value)功能一樣。
4.HashTable使用Enumeration,HashMap使用Iterator。
5.HashTable中hash數(shù)組默認大小是11,增加的方式是
old*2+1。HashMap中hash數(shù)組的默認大小是16,而且一定是2的指數(shù)。
6.哈希值的使用不同,HashTable直接使用對象的hashCode。
TreeMap能夠把它保存的記錄根據(jù)鍵排序,默認是按升序排序,也可以指定排序的比較器,當用Iterator遍歷TreeMap時,得到的記錄是排過序的。20TomcatApachejbossweblogic的區(qū)別Apache:全球應用最廣泛的http服務器,免費,出自apache基金組織Tomcat:應用也算非常廣泛的web服務器,支持部分j2ee,免費,出自apache基金組織JBoss:開源的應用服務器,比較受人喜愛,免費(文檔要收費)Weblogic:應該說算是業(yè)界第一的appserver,全部支持j2ee1.4,對于開發(fā)者,有免費使用一年的許可證。Apache支持靜態(tài)頁,Tomcat支持動態(tài)的,比如Servlet等,一般使用Apache+Tomcat的話,Apache只是作為一個轉(zhuǎn)發(fā),對JSP的處理是由Tomcat來處理的。Apche可以支持PHPcgiperl,但是要使用Java的話,你需要Tomcat在Apache后臺支撐,將Java請求由Apache轉(zhuǎn)發(fā)給Tomcat處理。Apache是Web服務器,Tomcat是應用(Java)服務器,它只是一個Servlet(JSP也翻譯成Servlet)容器,可以認為是Apache的擴展,但是可以獨立于Apache運行。JBoss和WebLogic都含有Jsp和Servlet容器,也就可以做web容器,也包含EJB容器,是完整的J2EE應用服務器。Tomcat只能做jsp和servlet的container21SessionCookie的區(qū)別①cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務器上。②cookie不是很安全,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙考慮到安全應當使用session。③session會在一定時間內(nèi)保存在服務器上。當訪問增多,會比較占用你服務器的性能
考慮到減輕服務器性能方面,應當使用COOKIE。④單個cookie保存的數(shù)據(jù)不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。22JDBC、Hibernate、Mybatis的區(qū)別JDBC->Mybatis->Hibernate:原生->半自動化->全自動化1)從層次上看,JDBC是較底層的持久層操作方式,而Hibernate和MyBatis都是在JDBC的基礎(chǔ)上進行了封裝使其更加方便程序員對持久層的操作。2)從功能上看,JDBC就是簡單的建立數(shù)據(jù)庫連接,然后創(chuàng)建statement,將sql語句傳給statement去執(zhí)行,如果是有返回結(jié)果的查詢語句,會將查詢結(jié)果放到ResultSet對象中,通過對ResultSet對象的遍歷操作來獲取數(shù)據(jù);Hibernate是將數(shù)據(jù)庫中的數(shù)據(jù)表映射為持久層的Java對象,實現(xiàn)數(shù)據(jù)表的完整性控制;MyBatis是將sql語句中的輸入?yún)?shù)和輸出參數(shù)映射為java對象,放棄了對數(shù)據(jù)表的完整性控制,但是獲得了更靈活和響應性能更快的優(yōu)勢。3)從使用上看,如果進行底層編程,而且對性能要求極高的話,應該采用JDBC的方式;如果要對數(shù)據(jù)庫進行完整性控制的話建議使用Hibernate;如果要靈活使用sql語句的話建議采用MyBatis框架。23SpringMVC與Struts2的區(qū)別目前企業(yè)中使用SpringMvc的比例已經(jīng)遠遠超過Struts2,那么兩者到底有什么區(qū)別,是很多初學者比較關(guān)注的問題,下面我們就來對SpringMvc和Struts2進行各方面的比較:1.核心控制器(前端控制器、預處理控制器):對于使用過mvc框架的人來說這個詞應該不會陌生,核心控制器的主要用途是處理所有的請求,然后對那些特殊的請求(控制器)統(tǒng)一的進行處理(字符編碼、文件上傳、參數(shù)接受、異常處理等等),springmvc核心控制器是Servlet,而Struts2是Filter。2.控制器實例:SpringMvc會比Struts快一些(理論上)。SpringMvc是基于方法設(shè)計,而Sturts是基于對象,每次發(fā)一次請求都會實例一個action,每個action都會被注入屬性,而Spring更像Servlet一樣,只有一個實例,每次請求執(zhí)行對應的方法即可(注意:由于是單例實例,所以應當避免全局變量的修改,這樣會產(chǎn)生線程安全問題)。3.管理方式:大部分的公司的核心架構(gòu)中,就會使用到spring,而springmvc又是spring中的一個模塊,所以spring對于springmvc的控制器管理更加簡單方便,而且提供了全注解方式進行管理,各種功能的注解都比較全面,使用簡單,而struts2需要采用XML很多的配置參數(shù)來管理(雖然也可以采用注解,但是幾乎沒有公司那樣使用)。4.參數(shù)傳遞:Struts2中自身提供多種參數(shù)接受,其實都是通過(ValueStack)進行傳遞和賦值,而SpringMvc是通過方法的參數(shù)進行接收。5.學習難度:Struts更加很多新的技術(shù)點,比如攔截器、值棧及OGNL表達式,學習成本較高,springmvc比較簡單,很較少的時間都能上手。6.intercepter的實現(xiàn)機制:struts有以自己的interceptor機制,springmvc用的是獨立的AOP方式。這樣導致struts的配置文件量還是比springmvc大,雖然struts的配置能繼承,所以我覺得論使用上來講,springmvc使用更加簡潔,開發(fā)效率SpringMVC確實比struts2高。springmvc是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應,所以說從架構(gòu)本身上spring3mvc就容易實現(xiàn)restfulurl。struts2是類級別的攔截,一個類對應一個request上下文;實現(xiàn)restfulurl要費勁,因為struts2action的一個方法可以對應一個url;而其類屬性卻被所有方法共享,這也就無法用注解或其他方式標識其所屬方法了。spring3mvc的方法之間基本上獨立的,獨享requestresponse數(shù)據(jù),請求數(shù)據(jù)通過參數(shù)獲取,處理結(jié)果通過ModelMap交回給框架方法之間不共享變量,而struts2搞的就比較亂,雖然方法之間也是獨立的,但其所有Action變量是共享的,這不會影響程序運行,卻給我們編碼,讀程序時帶來麻煩。7.springmvc處理ajax請求,直接通過返回數(shù)據(jù),方法中使用注解@ResponseBody,springmvc自動幫我們對象轉(zhuǎn)換為JSON數(shù)據(jù)。而struts2是通過插件的方式進行處理在SpringMVC流行起來之前,Struts2在MVC框架中占核心地位,隨著SpringMVC的出現(xiàn),SpringMVC慢慢的取代struts2,但是很多企業(yè)都是原來搭建的框架,使用Struts2較多。24請描述SpringMvc工作原理1、用戶向服務器發(fā)送請求,請求被Spring前端控制ServeltDispatcherServlet捕獲(捕獲)2、
DispatcherServlet對請求URL進行解析,得到請求資源標識符(URI)。然后根據(jù)該URI,調(diào)用HandlerMapping獲得該Handler配置的所有相關(guān)的對象(包括Handler對象以及Handler對象對應的攔截器),最后以HandlerExecutionChain對象的形式返回;(查找handler)3、
DispatcherServlet根據(jù)獲得的Handler,選擇一個合適的HandlerAdapter。
提取Request中的模型數(shù)據(jù),填充Handler入?yún)ⅲ_始執(zhí)行Handler(Controller),
Handler執(zhí)行完成后,向DispatcherServlet
返回一個ModelAndView對象(執(zhí)行handler)4、DispatcherServlet根據(jù)返回的ModelAndView,選擇一個適合的ViewResolver(必須是已經(jīng)注冊到Spring容器中的ViewResolver)
(選擇ViewResolver)5、通過ViewResolver結(jié)合Model和View,來渲染視圖,DispatcherServlet
將渲染結(jié)果返回給客戶端。(渲染返回)25請描述ssm(springspringmvcmybatis)工作流程先寫實體類entity,定義對象的屬性,(可以參照數(shù)據(jù)庫中表的字段來設(shè)置,數(shù)據(jù)庫的設(shè)計應該在所有編碼開始之前)。寫Mapper.xml(Mybatis),其中定義你的功能,對應要對數(shù)據(jù)庫進行的那些操作,比如insert、selectAll、selectByKey、delete、update等。寫Mapper.java,將Mapper.xml中的操作按照id映射成Java函數(shù)。寫Service.java,為控制層提供服務,接受控制層的參數(shù),完成相應的功能,并返回給控制層。寫Controller.java,連接頁面請求和服務層,獲取頁面請求的參數(shù),通過自動裝配,映射不同的URL到相應的處理函數(shù),并獲取參數(shù),對參數(shù)進行處理,之后傳給服務層。寫JSP頁面調(diào)用,請求哪些參數(shù),需要獲取什么數(shù)據(jù)26說說你對Java中反射的理解以及應用場景JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機制。Java反射機制主要提供了以下功能:在運行時判斷任意一個對象所屬的類;在運行時構(gòu)造任意一個類的對象;在運行時判斷任意一個類所具有的成員變量和方法;在運行時調(diào)用任意一個對象的方法;生成動態(tài)代理。應用:①獲取某個對象的屬性②獲取類的靜態(tài)屬性③執(zhí)行某對象方法④執(zhí)行類的靜態(tài)方法⑤創(chuàng)建某個類的實例⑥判斷對象是否是某個類的實例27Servlet的生命周期Servlet生命周期:Servlet加載>實例化>服務>銷毀。init:在Servlet的生命周期中,僅執(zhí)行一次init()方法。它是在服務器裝入Servlet時執(zhí)行的,負責初始化Servlet對象??梢耘渲梅掌?,以在啟動服務器或客戶機首次訪問Servlet時裝入Servlet。無論有多少客戶機訪問Servlet,都不會重復執(zhí)行init()。service:它是Servlet的核心,負責響應客戶的請求。每當一個客戶請求一個HttpServlet對象,該對象的Service()方法就要調(diào)用,而且傳遞給這個方法一個“請求”(ServletRequest)對象和一個“響應”(ServletResponse)對象作為參數(shù)。在HttpServlet中已存在Service()方法。默認的服務功能是調(diào)用與HTTP請求的方法相應的do功能。destroy:
僅執(zhí)行一次,在服務器端停止且卸載Servlet時執(zhí)行該方法。當Servlet對象退出生命周期時,負責釋放占用的資源。一個Servlet在運行service()方法時可能會產(chǎn)生其他的線程,因此需要確認在調(diào)用destroy()方法時,這些線程已經(jīng)終止或完成。創(chuàng)建Servlet對象的時機:Servlet容器啟動時:讀取web.xml配置文件中的信息,構(gòu)造指定的Servlet對象,創(chuàng)建ServletConfig對象,同時將ServletConfig對象作為參數(shù)來調(diào)用Servlet對象的init方法。在Servlet容器啟動后:客戶首次向Servlet發(fā)出請求,Servlet容器會判斷內(nèi)存中是否存在指定的Servlet對象,如果沒有則創(chuàng)建它,然后根據(jù)客戶的請求創(chuàng)建HttpRequest、HttpResponse對象,從而調(diào)用Servlet
對象的service方法。Servlet
Servlet容器在啟動時自動創(chuàng)建Servlet,這是由在web.xml文件中為Servlet設(shè)置的<load-on-startup>屬性決定的。從中我們也能看到同一個類型的Servlet對象在Servlet容器中以單例的形式存在。28equals相關(guān)問題:Java中equals和==的區(qū)別是什么?相等的理解(==和equals)相等:傳統(tǒng)的理解一般都是數(shù)字值是否相等;在程序中任何東西都是數(shù)據(jù),都會比較是否相等==基本數(shù)據(jù)類型:比較的就是值是否相等;引用數(shù)據(jù)類型:比較的是對象的地址是否一樣;equals(最初定義在根類Object中的)基本數(shù)據(jù)類型:不能夠使用!基本數(shù)據(jù)類型不是對象,不能夠調(diào)用Object中的方法引用數(shù)據(jù)類型:在Object的源碼中定義的就是==進行比較比較如果我們沒有去覆寫過equals方法而是直接調(diào)用到了Object中的此方法,那么結(jié)果和==比較應用數(shù)據(jù)類型一樣的;在實際開發(fā)中,我們一般比較對象都是通過對象的屬性值進行比較(一般比較對象的地址沒有多大用處),所以我們會經(jīng)常覆寫Object中的此方法,把自己的規(guī)則寫在方法里面;覆寫equals方法必須覆寫hashCode方法嗎?你的理解是什么?不是必須。但是假如一個類要創(chuàng)建很多對象,而這些對象要存儲集合不確定,有可能是hashSet,也有可能是TreeSet,為了保證唯一性,所以最好復寫hashCode方法,因為對象存入帶hash的集合,如hashSet,hashMap,都要基于hashCode和equals方法,當hashCode方法返回的值一樣時,還會調(diào)用equals方法判斷,如果兩個方法返回的都是一致,才判斷兩個對象是同一個對象,不存入集合(帶hash的集合都保證數(shù)據(jù)是唯一的?。?9開發(fā)這么久了遇到了哪些異常?Nullpointerexception、classnotfoundexception、arrayindexoutofboundsexception、illegalargumentexception、ClassCastException、FileNotFoundException、NumberFormatException、NoSuchMethodException、IOException、SQLException、NoClassDefFoundError、OutOfMemoryError30你了解分布式和數(shù)據(jù)庫集群嗎?分布式是一個非常廣泛的概念,從系統(tǒng)的角度來說,可以理解為,一個業(yè)務分拆多個子業(yè)務,部署在不同的服務器上,集群則是同一個業(yè)務部署在多個服務器上。JavaEE開發(fā)過程中,常見的分布式框架有:Dubbo、Hadoop、Elasticsearch數(shù)據(jù)庫集群:MySQL集群是一個無共享的(shared-nothing)、分布式節(jié)點架構(gòu)的存儲方案,其目的是提供容錯性和高性能。通過多個MySQL服務器分配負載,從而最大程序地達到高性能,通過在不同位置存儲數(shù)據(jù)保證高可用性和冗余。一般由一個主(寫)+一個備(寫)和N個從(讀)庫組成。31靜態(tài)變量和實例變量的區(qū)別?類變量也叫靜態(tài)變量,也就是在變量前加了static的變量;實例變量也叫對象變量,即沒加static的變量;區(qū)別在于:類變量是所有對象共有,其中一個對象將它值改變,其他對象得到的就是改變后的結(jié)果;而實例變量則屬對象私有,某一個對象將其值改變,不影響其他對象32Overload和Override的區(qū)別方法重載和方法重寫33MyBatis如何防止Sql注入①使用#{},避免使用${}。②使用存儲過程34svn提交代碼,發(fā)生沖突了如何處理①更新最新的服務器代碼下來②打開沖突的文件進行對比③簡單沖突直接修改,復雜沖突找到上個提交人協(xié)助修改,修改完成后標記為“已解決”④提交修改完成的文件35線程問題進程和線程的區(qū)別,簡單描述進程和線程?進程是具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次運行活動,進程是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位.線程是進程的一個實體,是CPU調(diào)度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源(如程序計數(shù)器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源.關(guān)系一個線程可以創(chuàng)建和撤銷另一個線程;同一個進程中的多個線程之間可以并發(fā)執(zhí)行.相對進程而言,線程是一個更加接近于執(zhí)行體的概念,它可以與同進程中的其他線程共享數(shù)據(jù),但擁有自己的棧空間,擁有獨立的執(zhí)行序列。區(qū)別進程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。進程有獨立的地址空間,一個進程崩潰后,在保護模式下不會對其它進程產(chǎn)生影響,而線程只是一個進程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對于一些要求同時進行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進程。1)
簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.2)
線程的劃分尺度小于進程,使得多線程程序的并發(fā)性高。3)
另外,進程在執(zhí)行過程中擁有獨立的內(nèi)存單元,而多個線程共享內(nèi)存,從而極大地提高了程序的運行效率。4)
線程在執(zhí)行過程中與進程還是有區(qū)別的。每個獨立的線程有一個程序運行的入口、順序執(zhí)行序列和程序的出口。但是線程不能夠獨立執(zhí)行,必須依存在應用程序中,由應用程序提供多個線程執(zhí)行控制。5)
從邏輯角度來看,多線程的意義在于一個應用程序中,有多個執(zhí)行部分可以同時執(zhí)行。但操作系統(tǒng)并沒有將多個線程看做多個獨立的應用,來實現(xiàn)進程的調(diào)度和管理以及資源分配。這就是進程和線程的重要區(qū)別。講講JDK的線程池ThreadPoolExecutor
ThreadPool中的線程不用手動開始,也不用手動取消,要做的只是把工作函數(shù)排入線程池,剩下的工作由系統(tǒng)自動完成,不能控制線程池中的線程。以下情況不適宜用ThreadPool:線程執(zhí)行時間長、線程需要制定不同的優(yōu)先級、執(zhí)行過程中需要控制線程的睡眠和掛起等操作。所以ThreadPool適合并發(fā)運行若干個運行時間不長且互不干擾的函數(shù)。①ThreadPoolExecutor作為java.util.concurrent包對外提供基礎(chǔ)實現(xiàn),以內(nèi)部線程池的形式對外提供管理任務執(zhí)行,線程調(diào)度,線程池管理等等服務;②Executors方法提供的線程服務,都是通過參數(shù)設(shè)置來實現(xiàn)不同的線程池機制。lock和synchronized區(qū)別①、ReentrantLock擁有Synchronized相同的并發(fā)性和內(nèi)存語義,此外還多了鎖投票,定時鎖等候和中斷鎖等候
線程A和B都要獲取對象O的鎖定,假設(shè)A獲取了對象O鎖,B將等待A釋放對O的鎖定,
如果使用synchronized,如果A不釋放,B將一直等下去,不能被中斷
如果使用ReentrantLock,如果A不釋放,可以使B在等待了足夠長的時間以后,中斷等待,而干別的事情
ReentrantLock獲取鎖定與三種方式:
a)
lock(),如果獲取了鎖立即返回,如果別的線程持有鎖,當前線程則一直處于休眠狀態(tài),直到獲取鎖
b)tryLock(),
如果獲取了鎖立即返回true,如果別的線程正持有鎖,立即返回false;
c)tryLock(long
timeout,TimeUnit
unit),
如果獲取了鎖定立即返回true,如果別的線程正持有鎖,會等待參數(shù)給定的時間,在等待的過程中,如果獲取了鎖定,就返回true,如果等待超時,返回false;
d)lockInterruptibly:如果獲取了鎖定立即返回,如果沒有獲取鎖定,當前線程處于休眠狀態(tài),直到或者鎖定,或者當前線程被別的線程中斷
②、synchronized是在JVM層面上實現(xiàn)的,不但可以通過一些監(jiān)控工具監(jiān)控synchronized的鎖定,而且在代碼執(zhí)行時出現(xiàn)異常,JVM會自動釋放鎖定,但是使用Lock則不行,lock是通過代碼實現(xiàn)的,要保證鎖定一定會被釋放,就必須將unLock()放到finally{}中
③、在資源競爭不是很激烈的情況下,Synchronized的性能要優(yōu)于ReetrantLock,但是在資源競爭很激烈的情況下,Synchronized的性能會下降幾十倍,但是ReetrantLock的性能能維持常態(tài);系統(tǒng)中的并發(fā)是怎樣解決的synchronized關(guān)鍵字主要解決多線程共享數(shù)據(jù)同步問題。
ThreadLocal使用場合主要解決多線程中數(shù)據(jù)因并發(fā)產(chǎn)生不一致問題。ThreadLocal和Synchonized都用于解決多線程并發(fā)訪問。但是ThreadLocal與synchronized有本質(zhì)的區(qū)別:synchronized是利用鎖的機制,使變量或代碼塊在某一時該只能被一個線程訪問。而ThreadLocal為每一個線程都提供了變量的副本,使得每個線程在某一時間訪問到的并不是同一個對象,這樣就隔離了多個線程對數(shù)據(jù)的數(shù)據(jù)共享。而Synchronized卻正好相反,它用于在多個線程間通信時能夠獲得數(shù)據(jù)共享。Synchronized用于線程間的數(shù)據(jù)共享,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023-2029年中國糠酸莫米松乳膏行業(yè)市場發(fā)展現(xiàn)狀及投資方向研究報告
- 2025年印刷雜件項目可行性研究報告
- 用藥咨詢行業(yè)發(fā)展方向及匹配能力建設(shè)研究報告
- 2025年輕炔項目可行性研究報告
- 2024-2026年中國新一代信息技術(shù)市場深度分析及投資戰(zhàn)略咨詢報告
- 林麝養(yǎng)殖年產(chǎn)4000克麝香建設(shè)項目可行性研究報告
- 2025年絕緣元件項目可行性研究報告
- 2025年俈線項目可行性研究報告
- 2025教育培訓協(xié)議書合同范本
- 2025砌筑工程施工勞務分包合同
- 生物化學期末考試題庫與答案
- 山東昌樂二中的“271高效課堂”
- 人教版高中物理新舊教材知識對比
- 國際結(jié)算期末復習試卷5套及參考答案
- 六年級上冊數(shù)學圓中方方中圓經(jīng)典題練習
- 現(xiàn)場組織機構(gòu)框圖及說明
- 《城鎮(zhèn)燃氣管理條例》解讀
- 七年級數(shù)學幾何證明題(典型)
- X62W萬能銑床電氣原理圖解析(共18頁)
- 小康煤礦水文地質(zhì)類型劃分報告
- (完整版)中央空調(diào)現(xiàn)場勘察信息表
評論
0/150
提交評論