雜碎知識(shí)點(diǎn)1
大四開始找工作后遇到的面試題進(jìn)行匯總,因?yàn)橹坝涗浀亩际窃谟械涝浦?,?fù)制到簡(jiǎn)書出現(xiàn)格式的問題,大致修補(bǔ)了一下,后續(xù)繼續(xù)上傳。
1、Integer緩存池問題
詳細(xì):https://www.cnblogs.com/Pjson/p/8777940.html
當(dāng)給Integer賦值在-128~127之間的時(shí)候會(huì)從緩存池中獲取值,這個(gè)時(shí)候用==比較倆值是相等的,超過這個(gè)范圍用==比較就返回false。
2、left join、right join、inner join
3、redis面試相關(guān)的問題:
1)緩存雪崩
同一時(shí)間內(nèi)有大量的key過期,導(dǎo)致訪問直接經(jīng)過數(shù)據(jù)庫(kù),使數(shù)據(jù)庫(kù)崩潰
- 緩存穿透
緩存穿透是指查詢一個(gè)一定不存在的數(shù)據(jù)。由于緩存不命中,并且出于容錯(cuò)考慮,如果從數(shù)據(jù)庫(kù)查不到數(shù)據(jù)則不寫入緩存,這將導(dǎo)致這個(gè)不存在的數(shù)據(jù)每次請(qǐng)求都要到數(shù)據(jù)庫(kù)去查詢,失去了緩存的意義。
3)緩存擊穿
同一時(shí)間內(nèi)大量的請(qǐng)求熱點(diǎn)數(shù)據(jù),但是該熱點(diǎn)數(shù)據(jù)在這個(gè)事件過期導(dǎo)致大量的請(qǐng)求走數(shù)據(jù)庫(kù) 導(dǎo)致數(shù)據(jù)庫(kù)崩潰
4)redis中的哨兵模式(集群中設(shè)置哨兵可以實(shí)現(xiàn)主節(jié)點(diǎn)宕掉后進(jìn)行快速的切換,配置 sentinel.conf文件 使用命令啟動(dòng)哨兵redis-sentinel sentinel.conf)
5)集群環(huán)境中可以使用redis來實(shí)現(xiàn)分布式鎖
4、消息隊(duì)列
https://www.zhihu.com/question/54152397?sort=created
5、springBoot實(shí)現(xiàn)自動(dòng)裝配的原理
在springboot的啟動(dòng)主方法 必不可少的@SpringBootApplication注解,在這個(gè)注解上有個(gè)@EnableAutoConfiguration注解,這個(gè)注解之上有個(gè)@import(AutoConfigurationImportSelector.class)
面試應(yīng)該怎么說
Spring Boot啟動(dòng)的時(shí)候會(huì)通過@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自動(dòng)配置類,并對(duì)其進(jìn)行加載,而這些自動(dòng)配置類都是以AutoConfiguration結(jié)尾來命名的,它實(shí)際上就是一個(gè)JavaConfig形式的Spring容器配置類,它能通過以Properties結(jié)尾命名的類中取得在全局配置文件中配置的屬性如:server.port,而XxxxProperties類是通過@ConfigurationProperties注解與全局配置文件中對(duì)應(yīng)的屬性進(jìn)行綁定的。
6、Ehcache實(shí)現(xiàn)緩存
ehcache分為on-heap和off-heap。
on-heap使用jvm內(nèi)存,可通過JVM的GC管理。
off-heap不使用jvm內(nèi)存,通過ehcache自行配置管理。
7、java設(shè)計(jì)模式
http://c.biancheng.net/view/1317.html
8、八種基本類型
byte,sort,int,long,float,double,boolean,char
9、接口和抽象類區(qū)別
1.抽象類可以有構(gòu)造方法,接口中不能有構(gòu)造方法。
2.抽象類中可以有普通成員變量,接口中沒有普通成員變量
3.抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法。
- 抽象類中的抽象方法的訪問類型可以是public,protected和(默認(rèn)類型,雖然
eclipse下不報(bào)錯(cuò),但應(yīng)該也不行),但接口中的抽象方法只能是public類型的,并且默認(rèn)即為public abstract類型。
抽象類中可以包含靜態(tài)方法,接口中不能包含靜態(tài)方法
抽象類和接口中都可以包含靜態(tài)成員變量,抽象類中的靜態(tài)成員變量的訪問類型可以任意,但接口中定義的變量只能是public static final類型,并且默認(rèn)即為public static final類型。
一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,但只能繼承一個(gè)抽象類。
10、Joinpoint和ProceedingJionpoint
https://blog.csdn.net/qq_15037231/article/details/80624064
/**
* 操作內(nèi)容和類型
* 難點(diǎn):執(zhí)行的方法不同 要獲取的操作內(nèi)容和類型也不同
*
* 通過自定義注解
*
* 獲取注解的值 連接點(diǎn)對(duì)象
* 1.通過連接點(diǎn)對(duì)象獲取方法簽名對(duì)象
* 2 通過方法簽名對(duì)象 獲取方法對(duì)象
* 3 獲取方法上的注解
*/
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
LogAnnotation annotation = method.getAnnotation(LogAnnotation.class);
cmfzLog.setLogContent(annotation.content());
cmfzLog.setLogType(annotation.type());

Object proceed() throws Throwable //執(zhí)行目標(biāo)方法
Object proceed(Object[] var1) throws Throwable //傳入的新的參數(shù)去執(zhí)行目標(biāo)方法
11、線程的創(chuàng)建
https://www.cnblogs.com/songshu120/p/7966314.html
1、實(shí)現(xiàn)Runnable接口實(shí)現(xiàn)run方法 使用Thread t1 = new Thread(task1); task1就是實(shí)現(xiàn)Runnable接口的類
2、繼承Thread 類,重寫run方法,new 該類 使用start方法
3、通過Callable和Future創(chuàng)建線程
Callable和Runnable區(qū)別:https://www.cnblogs.com/baizhanshi/p/6425209.html
12、executors與threadPoolExecutor區(qū)別
https://blog.csdn.net/weixin_38852633/article/details/91210491
13、SpringIOC的加載順序?
https://blog.csdn.net/qq_34203492/article/details/83865450
14、List線程安全的集合?
Vector、 CopyOnWriteArrayList(讀不加鎖寫加鎖)、
HashTable、ConcurrentHashMap (分段鎖、Segment對(duì)象加鎖)
15、redis的數(shù)據(jù)結(jié)構(gòu)
string list set hash
16、線程池的四種創(chuàng)建方式
https://www.cnblogs.com/lanseyitai1224/p/7895652.html
newCachedThreadPool創(chuàng)建一個(gè)可緩存線程池,如果線程池長(zhǎng)度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。
newFixedThreadPool 創(chuàng)建一個(gè)定長(zhǎng)線程池,可控制線程最大并發(fā)數(shù),超出的線程會(huì)在隊(duì)列中等待。
newScheduledThreadPool 創(chuàng)建一個(gè)定長(zhǎng)線程池,支持定時(shí)及周期性任務(wù)執(zhí)行。
newSingleThreadExecutor 創(chuàng)建一個(gè)單線程化的線程池,它只會(huì)用唯一的工作線程來執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級(jí))執(zhí)行。
如何創(chuàng)建線程池?
《阿里巴巴Java開發(fā)手冊(cè)》中強(qiáng)制線程池不允許使用 Executors 去創(chuàng)建,而是通過 new ThreadPoolExecutor 實(shí)例的方式,這樣的處理方式讓寫的同學(xué)更加明確線程池的運(yùn)行規(guī)則,規(guī)避資源耗盡的風(fēng)險(xiǎn)。

查看源碼可知:
queueCapacity的值為int最大值

17、線程池的參數(shù)
https://www.imooc.com/article/5887
corePoolSize 用于指定核心線程數(shù)量
maximumPoolSize 指定最大線程數(shù)
keepAliveTime 指定線程空閑后的最大存活時(shí)間
線程池參數(shù)講解:https://blog.csdn.net/tryingpfq/article/details/106146578
最大線程數(shù)設(shè)置:
1、CPU密集型:任務(wù)需要強(qiáng)大的運(yùn)算能力,CPU一直加速運(yùn)行,設(shè)置為CPU核心數(shù) + 1
2、IO密集型(讀寫請(qǐng)求多的:mysql redis):①、CPU核心數(shù) * 2
②、CPU核心數(shù) / 1- 阻塞系數(shù)(0.8~0.9) {適用于IO阻塞的場(chǎng)景}
阻塞隊(duì)列:
https://blog.csdn.net/u014590757/article/details/80362577

拒絕策略:

18、jvm

19、堆和棧的區(qū)別
20、http協(xié)議
https://www.cnblogs.com/an-wen/p/11180076.html
工作流程
- 瀏覽器向 DNS 服務(wù)器請(qǐng)求解析該 URL 中的域名所對(duì)應(yīng)的 IP 地址;
- 解析出 IP 地址后,根據(jù)該 IP 地址和默認(rèn)端口 80,和服務(wù)器建立TCP連接;
- 瀏覽器發(fā)出讀取文件(URL 中域名后面部分對(duì)應(yīng)的文件)的HTTP 請(qǐng)求,該請(qǐng)求報(bào)文作為 TCP 三次握手的第三個(gè)報(bào)文的數(shù)據(jù)發(fā)送給服務(wù)器;
- 服務(wù)器對(duì)瀏覽器請(qǐng)求作出響應(yīng),并把對(duì)應(yīng)的 html 文本發(fā)送給瀏覽器;
- 釋放 TCP連接;
- 瀏覽器將該 html 文本并顯示內(nèi)容;
請(qǐng)求協(xié)議(請(qǐng)求格式)
1、請(qǐng)求行
2、請(qǐng)求頭
3、空行
4、請(qǐng)求數(shù)據(jù)
21、SpringMVC執(zhí)行過程

Http 請(qǐng)求到 DispatcherServlet
(1) 客戶端請(qǐng)求提交到 DispatcherServlet。
HandlerMapping 尋找處理器
(2) 由 DispatcherServlet 控制器查詢一個(gè)或多個(gè) HandlerMapping,找到處理請(qǐng)求的 Controller。
調(diào)用處理器 Controller
(3) DispatcherServlet 將請(qǐng)求提交到 Controller。
Controller 調(diào)用業(yè)務(wù)邏輯處理后,返回 ModelAndView
(4)(5)調(diào)用業(yè)務(wù)處理和返回結(jié)果:Controller 調(diào)用業(yè)務(wù)邏輯處理后,返回 ModelAndView。
DispatcherServlet 查詢 ModelAndView
(6)(7)處理視圖映射并返回模型: DispatcherServlet 查詢一個(gè)或多個(gè) ViewResoler 視圖解析器, 找到 ModelAndView 指定的視圖。
ModelAndView 反饋瀏覽器 HTTP
(8) Http 響應(yīng):視圖負(fù)責(zé)將結(jié)果顯示到客戶端。
22、數(shù)據(jù)結(jié)構(gòu)
https://www.cnblogs.com/xilin/archive/2012/07/23/2605185.html
常用數(shù)據(jù)結(jié)構(gòu) :數(shù)組(靜態(tài)數(shù)組、動(dòng)態(tài)數(shù)組)、線性表、鏈表(單向鏈表、雙向鏈表、循環(huán)鏈表)、隊(duì)列、棧、樹(二叉樹、查找樹、平衡樹、線索、堆)、
圖等的定義、存儲(chǔ)和操作。
數(shù)組(Array)
數(shù)組是一種聚合數(shù)據(jù)類型,它是將具有相同類型的若干變量有序地組織在一起的集合。數(shù)組可以說是最基本的數(shù)據(jù)結(jié)構(gòu),在各種編程語言中都有對(duì)應(yīng)。一個(gè)數(shù)組可以分解為多個(gè)數(shù)組元素,按照數(shù)據(jù)元素的類型,數(shù)組可以分為整型數(shù)組、字符型數(shù)組、浮點(diǎn)型數(shù)組、指針數(shù)組和結(jié)構(gòu)數(shù)組等。數(shù)組還可以有一維、二維以及多維等表現(xiàn)形式。 [5]
棧( Stack)
棧是一種特殊的線性表,它只能在一個(gè)表的一個(gè)固定端進(jìn)行數(shù)據(jù)結(jié)點(diǎn)的插入和刪除操作。棧按照后進(jìn)先出的原則來存儲(chǔ)數(shù)據(jù),也就是說,先插入的數(shù)據(jù)將被壓入棧底,最后插入的數(shù)據(jù)在棧頂,讀出數(shù)據(jù)時(shí),從棧頂開始逐個(gè)讀出。棧在匯編語言程序中,經(jīng)常用于重要數(shù)據(jù)的現(xiàn)場(chǎng)保護(hù)。棧中沒有數(shù)據(jù)時(shí),稱為空棧。 [5]
隊(duì)列(Queue)
隊(duì)列和棧類似,也是一種特殊的線性表。和棧不同的是,隊(duì)列只允許在表的一端進(jìn)行插入操作,而在另一端進(jìn)行刪除操作。一般來說,進(jìn)行插入操作的一端稱為隊(duì)尾,進(jìn)行刪除操作的一端稱為隊(duì)頭。隊(duì)列中沒有元素時(shí),稱為空隊(duì)列。 [5]
鏈表( Linked List)
鏈表是一種數(shù)據(jù)元素按照鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)進(jìn)行存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu),這種存儲(chǔ)結(jié)構(gòu)具有在物理上存在非連續(xù)的特點(diǎn)。鏈表由一系列數(shù)據(jù)結(jié)點(diǎn)構(gòu)成,每個(gè)數(shù)據(jù)結(jié)點(diǎn)包括數(shù)據(jù)域和指針域兩部分。其中,指針域保存了數(shù)據(jù)結(jié)構(gòu)中下一個(gè)元素存放的地址。鏈表結(jié)構(gòu)中數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序來實(shí)現(xiàn)的。 [5]
樹( Tree)
樹是典型的非線性結(jié)構(gòu),它是包括,2個(gè)結(jié)點(diǎn)的有窮集合K。在樹結(jié)構(gòu)中,有且僅有一個(gè)根結(jié)點(diǎn),該結(jié)點(diǎn)沒有前驅(qū)結(jié)點(diǎn)。在樹結(jié)構(gòu)中的其他結(jié)點(diǎn)都有且僅有一個(gè)前驅(qū)結(jié)點(diǎn),而且可以有兩個(gè)后繼結(jié)點(diǎn),m≥0。 [5]
圖(Graph)
圖是另一種非線性數(shù)據(jù)結(jié)構(gòu)。在圖結(jié)構(gòu)中,數(shù)據(jù)結(jié)點(diǎn)一般稱為頂點(diǎn),而邊是頂點(diǎn)的有序偶對(duì)。如果兩個(gè)頂點(diǎn)之間存在一條邊,那么就表示這兩個(gè)頂點(diǎn)具有相鄰關(guān)系。 [5]
堆(Heap)
堆是一種特殊的樹形數(shù)據(jù)結(jié)構(gòu),一般討論的堆都是二叉堆。堆的特點(diǎn)是根結(jié)點(diǎn)的值是所有結(jié)點(diǎn)中最小的或者最大的,并且根結(jié)點(diǎn)的兩個(gè)子樹也是一個(gè)堆結(jié)構(gòu)。 [5]
散列表(Hash)
散列表源自于散列函數(shù)(Hash function),其思想是如果在結(jié)構(gòu)中存在關(guān)鍵字和T相等的記錄,那么必定在F(T)的存儲(chǔ)位置可以找到該記錄,這樣就可以不用進(jìn)行比較操作而直接取得所查記錄。 [5]
23、SQL的執(zhí)行順序
https://www.cnblogs.com/yuanshuo/p/11549251.html
https://jingyan.baidu.com/article/d5c4b52b97ea50da570dc510.html
(1)from
(3) join
(2) on
(4) where
(5)group by(開始使用select中的別名,后面的語句中都可以使用)
(6) avg,sum....
(7)having
(8) select
(9) distinct
(10) order by
24、volatile關(guān)鍵字的作用
https://www.cnblogs.com/zhengbin/p/5654805.html
1、可見性:是指線程之間的可見性,一個(gè)線程修改的狀態(tài)對(duì)另一個(gè)線程是可見的。
2、非原子性:原子是世界上的最小單位,具有不可分割性。
3、禁止指令重排:在java代碼編譯器可能會(huì)出現(xiàn)指令重排的情況,volital可以禁止
25、sleep和wait的區(qū)別
https://blog.csdn.net/qq_40531768/article/details/89306532
1、wait() 方法屬于Object類,sleep屬于Thread類
2、wait() 方法釋放同步鎖,sleep方法不會(huì)釋放同步鎖
3、wait() 方法一半與notify() 和notifyAll() 一塊使用
4、sleep() 方法需要捕獲異常,而wait() 、notify() 、notifyAll() 不用捕獲
26、多態(tài)的幾種寫法
三種:方法的重載,繼承或?qū)崿F(xiàn)接口,父類引用指向子類對(duì)象
27、端口號(hào)
oracle:1521
mysql:3306
redis:6379
ES:9200http端口,9300服務(wù)端口
hdfs:9000
haddop namenode:50070web瀏覽器的訪問端口
28、事務(wù)的隔離級(jí)別
https://blog.csdn.net/zhouym_/article/details/90381606
29、單例的代碼實(shí)現(xiàn)


30、什么情況回造成死鎖
循環(huán)等待的時(shí)候回造成死鎖
死鎖的產(chǎn)生
首先,明確概念性問題,什么是 死鎖(DeadLock)?
所謂死鎖是指多個(gè)進(jìn)程因競(jìng)爭(zhēng)資源而造成的一種僵局(互相等待),若無外力作用,這些進(jìn)程都將無法向前推進(jìn)。死鎖產(chǎn)生的4個(gè)必要條件:
- 互斥條件:進(jìn)程要求對(duì)所分配的資源(如打印機(jī))進(jìn)行排他性控制,即在一段時(shí)間內(nèi)某 資源僅為一個(gè)進(jìn)程所占有。此時(shí)若有其他進(jìn)程請(qǐng)求該資源,則請(qǐng)求進(jìn)程只能等待。
- 不剝奪條件:進(jìn)程所獲得的資源在未使用完畢之前,不能被其他進(jìn)程強(qiáng)行奪走,即只能 由獲得該資源的進(jìn)程自己來釋放(只能是主動(dòng)釋放)。
- 請(qǐng)求和保持條件:進(jìn)程已經(jīng)保持了至少一個(gè)資源,但又提出了新的資源請(qǐng)求,而該資源 已被其他進(jìn)程占有,此時(shí)請(qǐng)求進(jìn)程被阻塞,但對(duì)自己已獲得的資源保持不放。
- 循環(huán)等待條件:存在一種進(jìn)程資源的循環(huán)等待鏈,鏈中每一個(gè)進(jìn)程已獲得的資源同時(shí)被 鏈中下一個(gè)進(jìn)程所請(qǐng)求。
面試時(shí)的典型回答:
死鎖是一種特定的程序狀態(tài),在實(shí)體之間,由于循環(huán)依賴導(dǎo)致彼此一直處于等待之中,沒有任何個(gè)體可以繼續(xù)前進(jìn)。死鎖不僅僅是在線程之間會(huì)發(fā)生,存在資源獨(dú)占的進(jìn)程之間同樣也可能出現(xiàn)死鎖。通常來說,我們大多是聚焦在多線程場(chǎng)景中的死鎖,指兩個(gè)或多個(gè)線程之間,由于互相持有對(duì)方需要的所,而永久處于阻塞的狀態(tài)。
java怎么定位死鎖:
1、首先使用jps -l(該命令和linux和ps -ef | grep 很像 java ps)查看當(dāng)前運(yùn)行的java程序,得出程序的進(jìn)程號(hào)
2、再使用(jstack 進(jìn)程號(hào)) 命令查看結(jié)果找到如下的內(nèi)容:

31、為什么java中IO的緩存區(qū)可以提高讀寫效率
https://blog.csdn.net/weixin_30706507/article/details/95891286
調(diào)用I\O操作的時(shí)候,實(shí)際上還是一個(gè)一個(gè)的讀或者寫,關(guān)鍵就在,CPU只有一個(gè),不論是幾個(gè)核心。CPU在系統(tǒng)調(diào)用時(shí),會(huì)不會(huì)還要參與主要操作?參與多次就會(huì)花更多的時(shí)間。
系統(tǒng)調(diào)用時(shí),若不用緩沖,CPU會(huì)酌情考慮使用 中斷。此時(shí)CPU是主動(dòng)地,每個(gè)周期中都要花去一部分去詢問I\O設(shè)備是否讀完數(shù)據(jù),這段時(shí)間CPU不能做任何其他的事情(至少負(fù)責(zé)執(zhí)行這段模塊的核不能)。所以,調(diào)用一次讀了一個(gè)字,通報(bào)一次,CPU騰出時(shí)間處理一次。而設(shè)置緩沖,CPU通常會(huì)使用 DMA 方式去執(zhí)行 I\O 操作。CPU 將這個(gè)工作交給DMA控制器來做,自己騰出時(shí)間做其他的事,當(dāng)DMA完成工作時(shí),DMA會(huì)主動(dòng)告訴CPU“操作完成”。
這時(shí),CPU接管后續(xù)工作。在此,CPU 是被動(dòng)的。DMA是專門 做 I\O 與 內(nèi)存 數(shù)據(jù)交換的,不僅自身效率高,也節(jié)約了CPU時(shí)間,CPU在DMA開始和結(jié)束時(shí)做了一些設(shè)置罷了。
所以,調(diào)用一次,不必通報(bào)CPU,等緩沖區(qū)滿了,DMA 會(huì)對(duì)C PU 說 “嘿,伙計(jì)!快過來看看,把他們都搬走吧”。綜上,設(shè)置緩沖,就建立了數(shù)據(jù)塊,使得DMA執(zhí)行更方便,CPU也有空閑,而不是呆呆地候著I\O數(shù)據(jù)讀來。從微觀角度來說,設(shè)置緩沖效率要高很多。盡管,不能從這個(gè)程序上看出來。 幾萬字的讀寫\就能看到差距。
32、SQL查詢常見練習(xí)
https://mp.weixin.qq.com/s?src=11×tamp=1603019683&ver=2652&signature=LcdPMgbbtjJmiOTEwxHgBDMZmQUaHcytasol0ZuYaUNr7HRRuiuTTrIfy2PqSi5HoIHaM-I7uBYEx3sEveXTVaXtuJqt9vO4v6eBrTDejO2hgmDgKQUH4QdJIDwi&new=1
33、Mysql中的回表和索引覆蓋
InnoDB 索引:
https://blog.csdn.net/u013308490/article/details/83001060
回表索引覆蓋:
https://www.cnblogs.com/yanggb/p/11252966.html
34、常見算法
https://www.cnblogs.com/flyingdreams/p/11161157.html
35、java中的類加載器
36、異常的分類,什么異常需要try catch
https://www.cnblogs.com/lulipro/articles/7504267.html
https://blog.csdn.net/yongbutingxide/article/details/82861746
檢查時(shí)異常需要被try catch(SQL異常,IO異常)

37、synchronized實(shí)現(xiàn)原理和lock的一些高級(jí)用法
①、synchronized的實(shí)現(xiàn):是java關(guān)鍵字屬于JVM層面的
monitorenter:底層是通過monitor對(duì)象來完成,其實(shí)wai t/notify等方法也依賴Fimoni tor對(duì)象只有在同步塊或方法中才能漏wait/notify等方法。
monitorexit:退出

②、Lock是具體類( java. util. concurrent. locks. Lock )是api層面的鎖,必須手動(dòng)釋放鎖
2 使用方法
synchronized不需要用戶去手動(dòng)釋放鎖,當(dāng)synchronized 代碼執(zhí)行完后系統(tǒng)會(huì)自動(dòng)讓線程釋放對(duì)鎖的占用
ReentrantLock則需要用戶去手動(dòng)釋放鎖若沒有主動(dòng)釋放鎖,就有可能導(dǎo)致出現(xiàn)死鎖現(xiàn)象。
需要Lock()和unLock()方法配合try/finally語句塊來完成。
3 等待是否可中斷
synchronized不可中斷,除非拋出異?;蛘哒_\(yùn)行完成
ReentrantLock可中斷, 1.設(shè)置超時(shí)方法tryLock(long timeout, TimeUnit unit)
2. lockInterruptibly()放代碼塊中,調(diào)用interrupt() 方法可中斷
4 加鎖是否公平
synchronized非公平鎖
ReentrantLock兩者都可以,默認(rèn)非公平鎖,構(gòu)造方法可以傳入boolean值, true 為公平鎖,false為 非公平鎖
5 鎖綁定多個(gè)條件Condition
synchronized沒有
ReentrantLock用來實(shí)現(xiàn)分組喚醒需要喚醒的線程們,可以精確喚醒,而不是像synchronized.要么隨機(jī)喚醒一個(gè)線程要 么喚醒全部線程。
synchronizedsynchronized對(duì)不同對(duì)象加鎖的區(qū)別:
https://blog.csdn.net/oman001/article/details/105059069
lock鎖的一些常用方法:https://blog.csdn.net/hccc1/article/details/94160293
java中各種鎖:
公平和非公平鎖
可重入鎖(又名遞歸鎖)
自旋鎖——SpinLockDemo團(tuán)
獨(dú)占鎖(寫鎖)/共享鎖(讀鎖)/互斥鎖——ReentrantReadWriteLock lock.
38、IO 模型的形象舉例
https://blog.csdn.net/szxiaohe/article/details/81542605
BIO:創(chuàng)建線程池,如果有請(qǐng)求來處理就使用一個(gè)線程來處理請(qǐng)求,如果線程都被占用則放入等待隊(duì)列中,這種IO模型屬于偽異步IO模型
NIO:使用Selecter(多路復(fù)用器)和channal
39、樹的遍歷
https://www.pianshen.com/article/7106254596/
樹的遍歷也就是根據(jù)根節(jié)點(diǎn)的先后順序來定義的