String,Stringbuilder和Stringbuffer的區(qū)別
- String底層使用一個(gè)不可變的字符數(shù)組private final char value[];所以它內(nèi)容不可變钞楼。
- StringBuffer和StringBuilder都繼承了AbstractStringBuilder底層使用的是可變字符數(shù)組:char[] value;
- StringBuilder是線程不安全的,效率較高袄琳;而StringBuffer是線程安全的询件,效率較低。
- 通過(guò)他們的append()方法來(lái)看唆樊,StringBuffer是有同步鎖宛琅,而StringBuilder沒(méi)有
io流用的是什么設(shè)計(jì)模式?
- 裝飾者設(shè)計(jì)模式:給一個(gè)對(duì)象增加一些新的功能逗旁,而且是動(dòng)態(tài)的嘿辟,要求裝飾對(duì)象和被裝飾對(duì)象實(shí)現(xiàn)同一個(gè)接口,
裝飾對(duì)象持有被裝飾對(duì)象的實(shí)例(各種字符流間裝飾片效,各種字節(jié)流間裝飾) - 適配器設(shè)計(jì)模式:有時(shí)候我們需要實(shí)現(xiàn)一個(gè)接口红伦,但那個(gè)接口可能有很多抽象方法,我們只需要其中一個(gè)或多個(gè)方法淀衣。
這時(shí)候我們可以創(chuàng)建一個(gè)類(lèi)(適配器)實(shí)現(xiàn)接口昙读,并重寫(xiě)接口中所有方法(空方法,有方法體膨桥,但方法體中無(wú)內(nèi)容)蛮浑。
當(dāng)我們需要接口中的某個(gè)方法時(shí),只需繼承類(lèi)似于適配器的類(lèi) 只嚣,然后重寫(xiě)對(duì)應(yīng)的方法即可沮稚。
將某個(gè)類(lèi)的接口轉(zhuǎn)換成我們期望的另一個(gè)接口表示,目的是消除由于接口不匹配所造成類(lèi)的不兼容問(wèn)題(字符流與字節(jié)流間互相適配)
hashMap和hashTable的區(qū)別册舞?
- hashMap去掉了HashTable 的contains方法壮虫,但是加上了containsValue()和containsKey()方法。
- hashMap允許空鍵值环础,而hashTable不允許
- HashMap線程不安全,效率高剩拢。HashTable線程安全线得,效率低。
- HashMap的迭代器(Iterator)是fail-fast迭代器徐伐,而Hashtable的enumerator迭代器不是fail-fast(就是最快的時(shí)間能把錯(cuò)誤拋出而不是讓程序執(zhí)行贯钩。)的。
HashMap 的實(shí)現(xiàn)原理
- HashMap是基于哈希表的Map接口的非同步實(shí)現(xiàn)。此實(shí)現(xiàn)提供所有可選的映射操作角雷,并允許使用null值和null鍵祸穷。此類(lèi)不保證映射的順序,特別是它不保證該順序恒久不變勺三。
- 在java編程語(yǔ)言中雷滚,最基本的結(jié)構(gòu)就是兩種,一個(gè)是數(shù)組吗坚,另外一個(gè)是模擬指針(引用)祈远,所有的數(shù)據(jù)結(jié)構(gòu)都可以用這兩個(gè)基本結(jié)構(gòu)來(lái)構(gòu)造的濒生,HashMap實(shí)際上是一個(gè)“鏈表散列”的數(shù)據(jù)結(jié)構(gòu)甜橱,即數(shù)組和鏈表的結(jié)合體
- 當(dāng)我們往Hashmap中put元素時(shí),首先根據(jù)key的hashcode重新計(jì)算hash值,根絕hash值得到這個(gè)元素在數(shù)組中的位置(下標(biāo)),如果該數(shù)組在該位置上已經(jīng)存放了其他元素,那么在這個(gè)位置上的元素將以鏈表的形式存放,新加入的放在鏈頭,最先加入的放入鏈尾.如果數(shù)組中該位置沒(méi)有元素,就直接將該元素放到數(shù)組的該位置上。
hashTable的實(shí)現(xiàn)
- 和HashMap一樣灿意,Hashtable 也是一個(gè)散列表牡彻,它存儲(chǔ)的內(nèi)容是鍵值對(duì)(key-value)映射扫沼。
Hashtable 繼承于Dictionary,實(shí)現(xiàn)了Map庄吼、Cloneable缎除、java.io.Serializable接口。
Hashtable 的函數(shù)都是同步的霸褒,這意味著它是線程安全的伴找。它的key、value都不可以為null废菱。
Hashtable中的映射不是有序的技矮。
ConcurrentHashMap底層怎么實(shí)現(xiàn)的
- 鎖分段技術(shù),首先將數(shù)據(jù)分成一段一段的存儲(chǔ)殊轴,然后給每一段數(shù)據(jù)配一把鎖衰倦,當(dāng)一個(gè)線程占用鎖訪問(wèn)其中一個(gè)段數(shù)據(jù)的時(shí)候,其他段的數(shù)據(jù)也能被其他線程訪問(wèn)
ConcurrentHashMap將整個(gè)Map分為N個(gè)segment(類(lèi)似HashTable)旁理,可以提供相同的線程安全樊零,但是效率提升N倍,默認(rèn)N為16
數(shù)據(jù)庫(kù):怎么優(yōu)化的孽文?
- 將表中字段的寬度設(shè)得盡可能小
- 盡量把字段設(shè)置為NOT NULL驻襟,這樣在將來(lái)執(zhí)行查詢的時(shí)候,數(shù)據(jù)庫(kù)不用去比較NULL值
- 使用聯(lián)合(UNION)來(lái)代替手動(dòng)創(chuàng)建的臨時(shí)表
- 使用事務(wù)操作數(shù)據(jù)庫(kù):BEGIN; INSERT INTO salesinfo SET CustomerID=14; UPDATE inventory SET Quantity=11 WHERE item='book'; COMMIT;
(事務(wù)(Transaction)是并發(fā)控制的基本單位芋哭。所謂的事務(wù)沉衣,它是一個(gè)操作序列,這些操作要么都執(zhí)行减牺,要么都不執(zhí)行豌习,它是一個(gè)不可分割的工作單位存谎。事務(wù)是數(shù)據(jù)庫(kù)維護(hù)數(shù)據(jù)一致性的單位,在每個(gè)事務(wù)結(jié)束時(shí)肥隆,都能保持?jǐn)?shù)據(jù)一致性既荚。) - 使用索引:選擇合適的索引列,選擇在where栋艳,group by恰聘,order by,on從句中出現(xiàn)的列作為索引項(xiàng)嘱巾,對(duì)于離散度不大的列沒(méi)有必要?jiǎng)?chuàng)建索引
- 根據(jù)業(yè)務(wù)需求分割數(shù)據(jù)庫(kù)表
Redis有哪些數(shù)據(jù)類(lèi)型憨琳,用Redis做過(guò)一些什么
- Redis支持五種數(shù)據(jù)類(lèi)型:string(字符串),hash(哈希)旬昭,list(列表)篙螟,set(集合)及zset(sorted set:有序集合)。
string 類(lèi)型是二進(jìn)制安全的问拘。意思是 redis 的 string 可以包含任何數(shù)據(jù)遍略。比如jpg圖片或者序列化的對(duì)象。
string 類(lèi)型是 Redis 最基本的數(shù)據(jù)類(lèi)型骤坐,string 類(lèi)型的值最大能存儲(chǔ) 512MB绪杏。
Spring中用到了哪些設(shè)計(jì)模式
- 工廠設(shè)計(jì)模式
單例設(shè)計(jì)模式
代理設(shè)計(jì)模式
模板方法設(shè)計(jì)模式
觀察者設(shè)計(jì)模式
適配器設(shè)計(jì)模式
裝飾者設(shè)計(jì)模式
策略設(shè)計(jì)模式
java 中 IO 流分為幾種
- 按功能來(lái)分:輸入流(input)蕾久、輸出流(output)拌夏。
- 按類(lèi)型來(lái)分:字節(jié)流和字符流僧著。
Collection 和 Collections 有什么區(qū)別
- java.util.Collection 是一個(gè)集合接口(集合類(lèi)的一個(gè)頂級(jí)接口)。它提供了對(duì)集合對(duì)象進(jìn)行基本操作的通用接口方法障簿。
- Collections則是集合類(lèi)的一個(gè)工具類(lèi)/幫助類(lèi)
ArrayList 和 LinkedList 的區(qū)別
- 最明顯的區(qū)別是 ArrrayList底層的數(shù)據(jù)結(jié)構(gòu)是數(shù)組盹愚,支持隨機(jī)訪問(wèn),而 LinkedList 的底層數(shù)據(jù)結(jié)構(gòu)是雙向循環(huán)鏈表站故,不支持隨機(jī)訪問(wèn)
如何實(shí)現(xiàn)數(shù)組和 List 之間的轉(zhuǎn)換
- List轉(zhuǎn)換成為數(shù)組:調(diào)用ArrayList的toArray方法皆怕。
數(shù)組轉(zhuǎn)換成為L(zhǎng)ist:調(diào)用Arrays的asList方法。
Array 和 ArrayList 有何區(qū)別
- Array可以容納基本類(lèi)型和對(duì)象西篓,而ArrayList只能容納對(duì)象愈腾。
- Array是指定大小的,而ArrayList大小是固定的岂津。
- Array沒(méi)有提供ArrayList那么多功能顶滩,比如addAll、removeAll和iterator等
什么是反射
- 反射主要是指程序可以訪問(wèn)寸爆、檢測(cè)和修改它本身狀態(tài)或行為的一種能力
動(dòng)態(tài)代理是什么
- 當(dāng)想要給實(shí)現(xiàn)了某個(gè)接口的類(lèi)中的方法礁鲁,加一些額外的處理。比如說(shuō)加日志赁豆,加事務(wù)等仅醇。可以給這個(gè)類(lèi)創(chuàng)建一個(gè)代理魔种,故名思議就是創(chuàng)建一個(gè)新的類(lèi)析二,這個(gè)類(lèi)不僅包含原來(lái)類(lèi)方法的功能,而且還在原來(lái)的基礎(chǔ)上添加了額外處理的新類(lèi)节预。這個(gè)代理類(lèi)并不是定義好的叶摄,是動(dòng)態(tài)生成的。具有解耦意義安拟,靈活,擴(kuò)展性強(qiáng)糠赦。
深拷貝和淺拷貝區(qū)別是什么
- 淺拷貝只是復(fù)制了對(duì)象的引用地址拙泽,兩個(gè)對(duì)象指向同一個(gè)內(nèi)存地址,所以修改其中任意的值泼疑,另一個(gè)值都會(huì)隨之變化退渗,這就是淺拷貝(例:assign())
- 深拷貝是將對(duì)象及值復(fù)制過(guò)來(lái)氓辣,兩個(gè)對(duì)象修改其中任意的值另一個(gè)值不會(huì)改變袱蚓,這就是深拷貝(例:JSON.parse()和JSON.stringify()喇潘,但是此方法無(wú)法復(fù)制函數(shù)類(lèi)型)
如何避免 sql 注入
- PreparedStatement(簡(jiǎn)單又有效的方法)
- 使用正則表達(dá)式過(guò)濾傳入的參數(shù)
- 字符串過(guò)濾
- JSP中調(diào)用函數(shù)檢查是否包函非法字符
- JSP頁(yè)面判斷代碼
throw 和 throws 的區(qū)別
- throws是用來(lái)聲明一個(gè)方法可能拋出的所有異常信息颖低,throws是將異常聲明但是不處理,而是將異常往上傳忱屑,誰(shuí)調(diào)用我就交給誰(shuí)處理。
- 而throw則是指拋出的一個(gè)具體的異常類(lèi)型伴嗡。
get 和 post 請(qǐng)求有哪些區(qū)別
- GET在瀏覽器回退時(shí)是無(wú)害的,而POST會(huì)再次提交請(qǐng)求澄暮。
- GET產(chǎn)生的URL地址可以被Bookmark泣懊,而POST不可以馍刮。
- GET請(qǐng)求會(huì)被瀏覽器主動(dòng)cache用踩,而POST不會(huì)脐彩,除非手動(dòng)設(shè)置。
- GET請(qǐng)求只能進(jìn)行url編碼梅誓,而POST支持多種編碼方式梗掰。
- GET請(qǐng)求參數(shù)會(huì)被完整保留在瀏覽器歷史記錄里及穗,而POST中的參數(shù)不會(huì)被保留绵载。
- GET請(qǐng)求在URL中傳送的參數(shù)是有長(zhǎng)度限制的娃豹,而POST么有。
- 對(duì)參數(shù)的數(shù)據(jù)類(lèi)型鹃栽,GET只接受ASCII字符民鼓,而POST沒(méi)有限制。
- GET比POST更不安全恩掷,因?yàn)閰?shù)直接暴露在URL上,所以不能用來(lái)傳遞敏感信息峭状。
- GET參數(shù)通過(guò)URL傳遞优床,POST放在Request body中
說(shuō)一下你熟悉的設(shè)計(jì)模式
- 單例模式:
簡(jiǎn)單點(diǎn)說(shuō),就是一個(gè)應(yīng)用程序中着帽,某個(gè)類(lèi)的實(shí)例對(duì)象只有一個(gè)仍翰,你沒(méi)有辦法去new予借,因?yàn)闃?gòu)造器是被private修飾的频蛔,一般通過(guò)getInstance()的方法來(lái)獲取它們的實(shí)例 - 觀察者模式:對(duì)象間一對(duì)多的依賴關(guān)系晦溪,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí)三圆,所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。
- 工廠模式:簡(jiǎn)單工廠模式:一個(gè)抽象的接口哀澈,多個(gè)抽象接口的實(shí)現(xiàn)類(lèi)割按,一個(gè)工廠類(lèi)适荣,用來(lái)實(shí)例化抽象的接口
- 工廠方法模式:有四個(gè)角色,抽象工廠模式够吩,具體工廠模式丈氓,抽象產(chǎn)品模式万俗,具體產(chǎn)品模式。不再是由一個(gè)工廠類(lèi)去實(shí)例化具體的產(chǎn)品嚎研,而是由抽象工廠的子類(lèi)去實(shí)例化產(chǎn)品
spring
- Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架
- Spring通過(guò)一種稱作控制反轉(zhuǎn)(IoC)的技術(shù)促進(jìn)了松耦合临扮。當(dāng)應(yīng)用了IoC杆勇,一個(gè)對(duì)象依賴的其它對(duì)象會(huì)通過(guò)被動(dòng)的方式傳遞進(jìn)來(lái)靶橱,而不是這個(gè)對(duì)象自己創(chuàng)建或者查找依賴對(duì)象
- Spring提供了面向切面編程的豐富支持关霸,允許通過(guò)分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)級(jí)服務(wù)(例如審計(jì)(auditing)和事務(wù)(transaction)管理)進(jìn)行內(nèi)聚性的開(kāi)發(fā)
SpringMVC執(zhí)行流程
前端控制器(DispatcherServlet)→ 處理器映射器(HandlerMapping)杰扫,返回處理器執(zhí)行鏈 → 處理器適配器(HandlerAdapter)章姓,返回ModelAndView → 前端控制器接受ModelAndView凡伊,并請(qǐng)求視圖解析器解析(ViewResolver)
mybatis 中 #{}和 ${}的區(qū)別是什么
-
{}是預(yù)編譯處理,${}是字符串替換诵盼;
- Mybatis在處理#{}時(shí)风宁,會(huì)將sql中的#{}替換為?號(hào)戒财,調(diào)用PreparedStatement的set方法來(lái)賦值;
- Mybatis在處理{}替換成變量的值疗琉;
- 使用#{}可以有效的防止SQL注入,提高系統(tǒng)安全性凑耻。
zookeeper 是什么
- zookeeper 是一個(gè)分布式的香浩,開(kāi)放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),提供的功能包括:配置維護(hù)餐弱、域名服務(wù)膏蚓、分布式同步驮瞧、組服務(wù)等枯芬。
- 集群管理:監(jiān)控節(jié)點(diǎn)存活狀態(tài)千所、運(yùn)行請(qǐng)求等淫痰。
- 主節(jié)點(diǎn)選舉:主節(jié)點(diǎn)掛掉了之后可以從備用的節(jié)點(diǎn)開(kāi)始新一輪選主,主節(jié)點(diǎn)選舉說(shuō)的就是這個(gè)選舉的過(guò)程皂林,使用 zookeeper 可以協(xié)助完成這個(gè)過(guò)程蚯撩。
- 分布式鎖:zookeeper 提供兩種鎖:獨(dú)占鎖胎挎、共享鎖犹菇。獨(dú)占鎖即一次只能有一個(gè)線程使用資源,共享鎖是讀鎖共享胳搞,讀寫(xiě)互斥肌毅,即可以有多線線程同時(shí)讀同一個(gè)資源悬而,如果要使用寫(xiě)鎖也只能有一個(gè)線程使用锭汛。zookeeper可以對(duì)分布式鎖進(jìn)行控制唤殴。
- 命名服務(wù):在分布式系統(tǒng)中朵逝,通過(guò)使用命名服務(wù),客戶端應(yīng)用能夠根據(jù)指定名字來(lái)獲取資源或服務(wù)的地址页响,提供者等信
息闰蚕。 - zookeeper 有三種部署模式:?jiǎn)螜C(jī)部署:一臺(tái)集群上運(yùn)行没陡;集群部署:多臺(tái)集群運(yùn)行;偽集群部署:一臺(tái)集群?jiǎn)?dòng)多個(gè) zookeeper 實(shí)例運(yùn)行贴彼。
27器仗、說(shuō)一下 ACID
Atomicity(原子性)精钮、Consistency(一致性)轨香、Isolation(隔離性)幼东、Durability(持久性)
說(shuō)一下 jvm 的主要組成部分根蟹?及其作用?
類(lèi)加載器(ClassLoader)運(yùn)行時(shí)數(shù)據(jù)區(qū)(Runtime Data Area)執(zhí)行引擎(Execution Engine)本地庫(kù)接口(Native Interface)
說(shuō)一下 jvm 運(yùn)行時(shí)數(shù)據(jù)區(qū)?
程序計(jì)數(shù)器 虛擬機(jī)棧 本地方法棧 堆 方法區(qū)
說(shuō)一下堆棧的區(qū)別
- 棧內(nèi)存存儲(chǔ)的是局部變量而堆內(nèi)存存儲(chǔ)的是實(shí)體买决;
- 棧內(nèi)存的更新速度要快于堆內(nèi)存吼畏,因?yàn)榫植孔兞康纳芷诤芏蹋?/li>
- 棧內(nèi)存存放的變量生命周期一旦結(jié)束就會(huì)被釋放泻蚊,而堆內(nèi)存存放的實(shí)體會(huì)被垃圾回收機(jī)制不定時(shí)的回收性雄。
JVM,棧內(nèi)存溢出和堆內(nèi)存溢出:
- 棧:方法遞歸調(diào)用棧幀超過(guò)了棧的深度约计。堆:不斷的new對(duì)象則會(huì)導(dǎo)致堆中的空間溢出
jdk8新特性
- Lambda 表達(dá)式 ? Lambda 允許把函數(shù)作為一個(gè)方法的參數(shù)(函數(shù)作為參數(shù)傳遞到方法中)煤蚌。
- 方法引用 ? 方法引用提供了非常有用的語(yǔ)法尉桩,可以直接引用已有Java類(lèi)或?qū)ο螅▽?shí)例)的方法或構(gòu)造器蜘犁。與lambda聯(lián)合使用沽瘦,方法引用可以使語(yǔ)言的構(gòu)造更緊湊簡(jiǎn)潔,減少冗余代碼良哲。
- 默認(rèn)方法 ? 默認(rèn)方法就是一個(gè)在接口里面有了一個(gè)實(shí)現(xiàn)的方法筑凫。
- 新工具 ? 新的編譯工具巍实,如:Nashorn引擎 jjs棚潦、 類(lèi)依賴分析器jdeps膝昆。
- Stream API ?新添加的Stream API(java.util.stream) 把真正的函數(shù)式編程風(fēng)格引入到Java中荚孵。
- Date Time API ? 加強(qiáng)對(duì)日期與時(shí)間的處理。
- Optional 類(lèi) ? Optional 類(lèi)已經(jīng)成為 Java 8 類(lèi)庫(kù)的一部分骄呼,用來(lái)解決空指針異常蜓萄。
- Nashorn, JavaScript 引擎 ? Java 8提供了一個(gè)新的Nashorn javascript引擎绕德,它允許我們?cè)贘VM上運(yùn)行特定的javascript應(yīng)用耻蛇。
正向代理
一個(gè)位于客戶端和原始服務(wù)器(origin server)之間的服務(wù)器,為了從原始服務(wù)器取得內(nèi)容跃捣,客戶端向代理發(fā)送一個(gè)請(qǐng)求并指定目標(biāo)(原始服務(wù)器)然后代理向原始服務(wù)器轉(zhuǎn)交請(qǐng)求并將獲得的內(nèi)容返回給客戶端疚漆∪⑵福客戶端才能使用正向代理甚脉,正向代理總結(jié)就一句話:代理端代理的是客戶端
反向代理
反向代理(Reverse Proxy)方式是指以代理服務(wù)器來(lái)接受internet上的連接請(qǐng)求牺氨,然后將請(qǐng)求猴凹,發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器并將從服務(wù)器上得到的結(jié)果返回給internet上請(qǐng)求連接的客戶端郊霎,此時(shí)代理服務(wù)器對(duì)外就表現(xiàn)為一個(gè)反向代理服務(wù)器反向代理總結(jié)就一句話:代理端代理的是服務(wù)端
事務(wù)的特性
- 原子性(Atomicity)原子性是指事務(wù)包含的所有操作要么全部成功,要么全部失敗回滾进倍,這和前面兩篇博客介紹事務(wù)的功能是一樣的概念,因此事務(wù)的操作如果成功就必須要完全應(yīng)用到數(shù)據(jù)庫(kù)洞斯,如果操作失敗則不能對(duì)數(shù)據(jù)庫(kù)有任何影響
- 一致性(Consistency)一致性是指事務(wù)必須使數(shù)據(jù)庫(kù)從一個(gè)一致性狀態(tài)變換到另一個(gè)一致性狀態(tài)烙如,也就是說(shuō)一個(gè)事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)亚铁。拿轉(zhuǎn)賬來(lái)說(shuō)螟加,假設(shè)用戶A和用戶B兩者的錢(qián)加起來(lái)一共是5000,那么不管A和B之間如何轉(zhuǎn)賬然爆,轉(zhuǎn)幾次賬曾雕,事務(wù)結(jié)束后兩個(gè)用戶的錢(qián)相加起來(lái)應(yīng)該還得是5000剖张,這就是事務(wù)的一致性。
- 隔離性(Isolation)隔離性是當(dāng)多個(gè)用戶并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)時(shí)幅虑,比如操作同一張表時(shí)翘单,數(shù)據(jù)庫(kù)為每一個(gè)用戶開(kāi)啟的事務(wù)哄芜,不能被其他事務(wù)的操作所干擾认臊,多個(gè)并發(fā)事務(wù)之間要相互隔離。即要達(dá)到這么一種效果:對(duì)于任意兩個(gè)并發(fā)的事務(wù)T1和T2涂屁,在事務(wù)T1看來(lái)拆又,T2要么在T1開(kāi)始之前就已經(jīng)結(jié)束栏账,要么在T1結(jié)束之后才開(kāi)始,這樣每個(gè)事務(wù)都感覺(jué)不到有其他事務(wù)在并發(fā)地執(zhí)行竖般。
- 持久性(Durability)持久性是指一個(gè)事務(wù)一旦被提交了茶鹃,那么對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫(kù)系統(tǒng)遇到故障的情況下也不會(huì)丟失提交事務(wù)的操作胞谭。
jsp的內(nèi)置對(duì)象
- request丈屹、response、session彩库、application骇钦、out眯搭、pagecontext业岁、page笔时、config允耿、exception
JSP中四大域?qū)ο?/h2>
- page、request业稼、session低散、application
數(shù)據(jù)庫(kù)的樂(lè)觀鎖和悲觀鎖
- 悲觀鎖:假定會(huì)發(fā)生并發(fā)沖突谦纱,屏蔽一切可能違反數(shù)據(jù)完整性的操作
- 樂(lè)觀鎖:假設(shè)不會(huì)發(fā)生并發(fā)沖突君编,只在提交操作時(shí)檢查是否違反數(shù)據(jù)完整性
創(chuàng)建線程有哪幾種方式
- 繼承Thread類(lèi)創(chuàng)建線程類(lèi)吃嘿,并重寫(xiě)該類(lèi)的run方法
- 定義runnable接口的實(shí)現(xiàn)類(lèi)兑燥,并重寫(xiě)該接口的run()方法
- 創(chuàng)建Callable接口的實(shí)現(xiàn)類(lèi)
runnable 和 callable 有什么區(qū)別
- Runnable接口中的run()方法的返回值是void
- Callable接口中的call()方法是有返回值的降瞳,是一個(gè)泛型
線程有哪些狀態(tài)?
- 線程通常都有五種狀態(tài)除师,創(chuàng)建(生成線程對(duì)象汛聚,并沒(méi)有調(diào)用該對(duì)象的start方法)倚舀、就緒(當(dāng)調(diào)用了線程對(duì)象的start方法之后)痕貌、運(yùn)行(線程調(diào)度程序?qū)⑻幱诰途w狀態(tài)的線程設(shè)置為當(dāng)前線程)讶踪、阻塞(sleep,wait等方法都可以導(dǎo)致線程阻塞)和死亡(一個(gè)線程的run方法執(zhí)行結(jié)束或者調(diào)用stop方法后)
sleep() 和 wait() 有什么區(qū)別
- sleep():線程類(lèi)(Thread)的靜態(tài)方法,讓調(diào)用線程進(jìn)入睡眠狀態(tài)柱查,讓出執(zhí)行機(jī)會(huì)給其他線程唉工,等到休眠時(shí)間結(jié)束后淋硝,線程進(jìn)入就緒狀態(tài)和其他線程一起競(jìng)爭(zhēng)cpu的執(zhí)行時(shí)間谣膳。因?yàn)閟leep() 是static靜態(tài)的方法继谚,他不能改變對(duì)象的機(jī)鎖
- wait():wait()是Object類(lèi)的方法花履,當(dāng)一個(gè)線程執(zhí)行到wait方法時(shí),它就進(jìn)入到一個(gè)和該對(duì)象相關(guān)的等待池济瓢,同時(shí)釋放對(duì)象的機(jī)鎖旺矾,使得其他線程能夠訪問(wèn)宠漩,可以通過(guò)notify扒吁,notifyAll方法來(lái)喚醒等待的線程
線程的 run()和 start()有什么區(qū)別
- 方法run()稱為線程體雕崩。通過(guò)調(diào)用Thread類(lèi)的start()方法來(lái)啟動(dòng)一個(gè)線程盼铁。
- start()方法來(lái)啟動(dòng)一個(gè)線程尝偎,真正實(shí)現(xiàn)了多線程運(yùn)行
- run()方法是在本線程里的肤寝,只是線程里的一個(gè)函數(shù),而不是多線程的
- 多線程執(zhí)行時(shí)要使用start()方法而不是run()方法
java線程池核心類(lèi):ThreadPoolExecutor
- corePoolSize:核心線程數(shù)
- queueCapacity:任務(wù)隊(duì)列容量(阻塞隊(duì)列)
- maxPoolSize:最大線程數(shù)
- keepAliveTime:線程空閑時(shí)間
- allowCoreThreadTimeout:允許核心線程超時(shí)
- rejectedExecutionHandler:任務(wù)拒絕處理器
創(chuàng)建線程池有哪幾種方式
- newFixedThreadPool(int nThreads)創(chuàng)建一個(gè)固定長(zhǎng)度的線程池鲤看,每當(dāng)提交一個(gè)任務(wù)就創(chuàng)建一個(gè)線程
- newCachedThreadPool()創(chuàng)建一個(gè)可緩存的線程池
- newSingleThreadExecutor()這是一個(gè)單線程的Executor义桂,它創(chuàng)建單個(gè)工作線程來(lái)執(zhí)行任務(wù)
- newScheduledThreadPool(int corePoolSize)創(chuàng)建了一個(gè)固定長(zhǎng)度的線程池
線程池都有哪些狀態(tài)蹈垢?
線程池有5種狀態(tài):Running曹抬、ShutDown、Stop嚷闭、Tidying胞锰、Terminated嗅榕。
ThreadPoolExecutor執(zhí)行順序
線程池按以下行為執(zhí)行任務(wù)
- 當(dāng)線程數(shù)小于核心線程數(shù)時(shí)凌那,創(chuàng)建線程帽蝶。
- 當(dāng)線程數(shù)大于等于核心線程數(shù),且任務(wù)隊(duì)列未滿時(shí)囱井,將任務(wù)放入任務(wù)隊(duì)列驹尼。
- 當(dāng)線程數(shù)大于等于核心線程數(shù),且任務(wù)隊(duì)列已滿
(若線程數(shù)小于最大線程數(shù)庞呕,創(chuàng)建線程新翎,若線程數(shù)等于最大線程數(shù),拋出異常住练,拒絕任務(wù))
List地啰、Set
- Set 接口實(shí)例存儲(chǔ)的是無(wú)序的,不重復(fù)的數(shù)據(jù)讲逛,刪除和插入效率高
- List 接口實(shí)例存儲(chǔ)的是有序的髓绽,可以重復(fù)的元素顺呕,List檢索效率高
- ArrayList是List接口的一種實(shí)現(xiàn),它是使用數(shù)組來(lái)實(shí)現(xiàn)的。
- LinkedList是List接口的一種實(shí)現(xiàn)卧抗,它是使用鏈表來(lái)實(shí)現(xiàn)的。
- ArrayList 遍歷和查找元素比較快泳秀。
ajax中async屬性用于控制同步和異步
- true(異步請(qǐng)求檩赢,默認(rèn))币他,flase(同步)
防止數(shù)據(jù)庫(kù)崩潰的策略
- 主從服務(wù)器策略拍冠,主服務(wù)器異步傳輸數(shù)據(jù)到從服務(wù)器上
并行和并發(fā)有什么區(qū)別
- 并行是在不同實(shí)體上的多個(gè)事件,并發(fā)是在同一實(shí)體上的多個(gè)事件
- 在一臺(tái)處理器上“同時(shí)”處理多個(gè)任務(wù),在多臺(tái)處理器上同時(shí)處理多個(gè)任務(wù)
高并發(fā)(High Concurrency)
是互聯(lián)網(wǎng)分布式系統(tǒng)架構(gòu)設(shè)計(jì)中必須考慮的因素之一断盛,它通常是指命迈,通過(guò)設(shè)計(jì)保證系統(tǒng)能夠同時(shí)并行處理很多請(qǐng)求淑倾。
提高系統(tǒng)并發(fā)能力的方式,方法論上主要有兩種:
垂直擴(kuò)展(Scale Up)與水平擴(kuò)展(Scale Out)脱茉。前者垂直擴(kuò)展可以通過(guò)提升單機(jī)硬件性能税肪,或者提升單機(jī)架構(gòu)性能箭券,來(lái)提高并發(fā)性,但單機(jī)性能總是有極限的国章,互聯(lián)網(wǎng)分布式架構(gòu)設(shè)計(jì)高并發(fā)終極解決方案還是后者:水平擴(kuò)展四啰。
水平擴(kuò)展:互聯(lián)網(wǎng)分層架構(gòu)中适滓,各層次水平擴(kuò)展的實(shí)踐又有所不同:
(1)反向代理層可以通過(guò)“DNS輪詢”的方式來(lái)進(jìn)行水平擴(kuò)展苦囱;
(2)站點(diǎn)層可以通過(guò)nginx來(lái)進(jìn)行水平擴(kuò)展猛拴;
(3)服務(wù)層可以通過(guò)服務(wù)連接池來(lái)進(jìn)行水平擴(kuò)展;
(4)數(shù)據(jù)庫(kù)可以按照數(shù)據(jù)范圍,或者數(shù)據(jù)哈希的方式來(lái)進(jìn)行水平擴(kuò)展;
并行和并發(fā)有什么區(qū)別
- 并行是在不同實(shí)體上的多個(gè)事件堪侯,并發(fā)是在同一實(shí)體上的多個(gè)事件
- 在一臺(tái)處理器上“同時(shí)”處理多個(gè)任務(wù),在多臺(tái)處理器上同時(shí)處理多個(gè)任務(wù)
進(jìn)程和線程的區(qū)別
- 進(jìn)程是程序運(yùn)行和資源分配的基本單位滓玖,一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程。
- 進(jìn)程在執(zhí)行過(guò)程中擁有獨(dú)立的內(nèi)存單元粱坤,而多個(gè)線程共享內(nèi)存資源
- 線程是進(jìn)程的一個(gè)實(shí)體,是cpu調(diào)度和分派的基本單位,是比程序更小的能獨(dú)立運(yùn)行的基本單位
- 同一進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行。
守護(hù)線程(即daemon thread)
是個(gè)服務(wù)線程雕什,準(zhǔn)確地來(lái)說(shuō)就是服務(wù)其他的線程