java面試高頻知識點(diǎn)匯總 2021-02-24

雜碎知識點(diǎn)1

大四開始找工作后遇到的面試題進(jìn)行匯總,因?yàn)橹坝涗浀亩际窃谟械涝浦校瑥?fù)制到簡書出現(xiàn)格式的問題膳算,大致修補(bǔ)了一下,后續(xù)繼續(xù)上傳弛作。

1涕蜂、Integer緩存池問題

詳細(xì):https://www.cnblogs.com/Pjson/p/8777940.html

當(dāng)給Integer賦值在-128~127之間的時候會從緩存池中獲取值,這個時候用==比較倆值是相等的映琳,超過這個范圍用==比較就返回false机隙。

2、left join刊头、right join黍瞧、inner join

3、redis面試相關(guān)的問題:

1)緩存雪崩

同一時間內(nèi)有大量的key過期原杂,導(dǎo)致訪問直接經(jīng)過數(shù)據(jù)庫印颤,使數(shù)據(jù)庫崩潰

  1. 緩存穿透

緩存穿透是指查詢一個一定不存在的數(shù)據(jù)。由于緩存不命中穿肄,并且出于容錯考慮年局,如果從數(shù)據(jù)庫查不到數(shù)據(jù)則不寫入緩存,這將導(dǎo)致這個不存在的數(shù)據(jù)每次請求都要到數(shù)據(jù)庫去查詢咸产,失去了緩存的意義矢否。

3)緩存擊穿

同一時間內(nèi)大量的請求熱點(diǎn)數(shù)據(jù),但是該熱點(diǎn)數(shù)據(jù)在這個事件過期導(dǎo)致大量的請求走數(shù)據(jù)庫 導(dǎo)致數(shù)據(jù)庫崩潰

4)redis中的哨兵模式(集群中設(shè)置哨兵可以實(shí)現(xiàn)主節(jié)點(diǎn)宕掉后進(jìn)行快速的切換脑溢,配置 sentinel.conf文件 使用命令啟動哨兵redis-sentinel sentinel.conf)

5)集群環(huán)境中可以使用redis來實(shí)現(xiàn)分布式鎖

https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247484609&idx=1&sn=4c053236699fde3c2db1241ab497487b&chksm=ebd745c0dca0ccd682e91938fc30fa947df1385b06d6ae9bb52514967b0736c66684db2f1ac9&token=177635168&lang=zh_CN#rd

4僵朗、消息隊列

https://www.zhihu.com/question/54152397?sort=created

5、springBoot實(shí)現(xiàn)自動裝配的原理

在springboot的啟動主方法 必不可少的@SpringBootApplication注解屑彻,在這個注解上有個@EnableAutoConfiguration注解验庙,這個注解之上有個@import(AutoConfigurationImportSelector.class)

面試應(yīng)該怎么說

Spring Boot啟動的時候會通過@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自動配置類,并對其進(jìn)行加載社牲,而這些自動配置類都是以AutoConfiguration結(jié)尾來命名的粪薛,它實(shí)際上就是一個JavaConfig形式的Spring容器配置類,它能通過以Properties結(jié)尾命名的類中取得在全局配置文件中配置的屬性如:server.port搏恤,而XxxxProperties類是通過@ConfigurationProperties注解與全局配置文件中對應(yīng)的屬性進(jìn)行綁定的违寿。

https://www.baidu.com/link?url=SOBm5Fpn7rfUhPna-FM0qJ3-41-D0N3wJqWlyzbLPKqZVr54k6KK1pfJUIjycPN82p2npaEclIWW4K2w4n4IDEGZvGusmLUhEqrSl0mwatK&wd=&eqid=e05faa350002dfdf000000035f4b61ae

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è)計模式

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.抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的窍帝,不能有非抽象的普通方法努潘。

  1. 抽象類中的抽象方法的訪問類型可以是public,protected和(默認(rèn)類型,雖然

eclipse下不報錯坤学,但應(yīng)該也不行)疯坤,但接口中的抽象方法只能是public類型的,并且默認(rèn)即為public abstract類型深浮。

  1. 抽象類中可以包含靜態(tài)方法压怠,接口中不能包含靜態(tài)方法

  2. 抽象類和接口中都可以包含靜態(tài)成員變量,抽象類中的靜態(tài)成員變量的訪問類型可以任意飞苇,但接口中定義的變量只能是public static final類型菌瘫,并且默認(rèn)即為public static final類型。

  3. 一個類可以實(shí)現(xiàn)多個接口布卡,但只能繼承一個抽象類突梦。

10、Joinpoint和ProceedingJionpoint

https://blog.csdn.net/qq_15037231/article/details/80624064

/**
         * 操作內(nèi)容和類型
         * 難點(diǎn):執(zhí)行的方法不同  要獲取的操作內(nèi)容和類型也不同
         *
         * 通過自定義注解
         *
         * 獲取注解的值  連接點(diǎn)對象
         * 1.通過連接點(diǎn)對象獲取方法簽名對象
         * 2 通過方法簽名對象 獲取方法對象
         * 3 獲取方法上的注解
         */
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        LogAnnotation annotation = method.getAnnotation(LogAnnotation.class);

        cmfzLog.setLogContent(annotation.content());
        cmfzLog.setLogType(annotation.type());
image.png
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對象加鎖)

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)建一個可緩存線程池,如果線程池長度超過處理需要苗胀,可靈活回收空閑線程襟诸,若無可回收,則新建線程基协。

newFixedThreadPool 創(chuàng)建一個定長線程池歌亲,可控制線程最大并發(fā)數(shù),超出的線程會在隊列中等待澜驮。

newScheduledThreadPool 創(chuàng)建一個定長線程池陷揪,支持定時及周期性任務(wù)執(zhí)行。

newSingleThreadExecutor 創(chuàng)建一個單線程化的線程池泉唁,它只會用唯一的工作線程來執(zhí)行任務(wù)鹅龄,保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級)執(zhí)行。

如何創(chuàng)建線程池亭畜?

《阿里巴巴Java開發(fā)手冊》中強(qiáng)制線程池不允許使用 Executors 去創(chuàng)建扮休,而是通過 new ThreadPoolExecutor 實(shí)例的方式,這樣的處理方式讓寫的同學(xué)更加明確線程池的運(yùn)行規(guī)則拴鸵,規(guī)避資源耗盡的風(fēng)險玷坠。

image.jpeg

查看源碼可知:

queueCapacity的值為int最大值

image.jpeg

17、線程池的參數(shù)

https://www.imooc.com/article/5887

  • corePoolSize 用于指定核心線程數(shù)量

  • maximumPoolSize 指定最大線程數(shù)

  • keepAliveTime 指定線程空閑后的最大存活時間

線程池參數(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密集型(讀寫請求多的:mysql redis):①兄渺、CPU核心數(shù) * 2

②、CPU核心數(shù) / 1- 阻塞系數(shù)(0.8~0.9) {適用于IO阻塞的場景}

阻塞隊列:

https://blog.csdn.net/u014590757/article/details/80362577

image.jpeg

拒絕策略:

image.jpeg

18汰现、jvm

image.jpeg

19挂谍、堆和棧的區(qū)別

20、http協(xié)議

https://www.cnblogs.com/an-wen/p/11180076.html

工作流程

  1. 瀏覽器向 DNS 服務(wù)器請求解析該 URL 中的域名所對應(yīng)的 IP 地址;
  2. 解析出 IP 地址后瞎饲,根據(jù)該 IP 地址和默認(rèn)端口 80口叙,和服務(wù)器建立TCP連接;
  3. 瀏覽器發(fā)出讀取文件(URL 中域名后面部分對應(yīng)的文件)的HTTP 請求,該請求報文作為 TCP 三次握手的第三個報文的數(shù)據(jù)發(fā)送給服務(wù)器;
  4. 服務(wù)器對瀏覽器請求作出響應(yīng)嗅战,并把對應(yīng)的 html 文本發(fā)送給瀏覽器;
  5. 釋放 TCP連接;
  6. 瀏覽器將該 html 文本并顯示內(nèi)容;

請求協(xié)議(請求格式)

1妄田、請求行

2、請求頭

3、空行

4疟呐、請求數(shù)據(jù)

21脚曾、SpringMVC執(zhí)行過程

image.jpeg

Http 請求到 DispatcherServlet

(1) 客戶端請求提交到 DispatcherServlet。

HandlerMapping 尋找處理器

(2) 由 DispatcherServlet 控制器查詢一個或多個 HandlerMapping萨醒,找到處理請求的 Controller斟珊。

調(diào)用處理器 Controller

(3) DispatcherServlet 將請求提交到 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 查詢一個或多個 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ù)組勤庐、動態(tài)數(shù)組)、線性表好港、鏈表(單向鏈表愉镰、雙向鏈表、循環(huán)鏈表)钧汹、隊列丈探、棧、樹(二叉樹拔莱、查找樹碗降、平衡樹、線索塘秦、堆)讼渊、

圖等的定義、存儲和操作尊剔。

數(shù)組(Array)

數(shù)組是一種聚合數(shù)據(jù)類型爪幻,它是將具有相同類型的若干變量有序地組織在一起的集合。數(shù)組可以說是最基本的數(shù)據(jù)結(jié)構(gòu)须误,在各種編程語言中都有對應(yīng)笔咽。一個數(shù)組可以分解為多個數(shù)組元素,按照數(shù)據(jù)元素的類型霹期,數(shù)組可以分為整型數(shù)組、字符型數(shù)組拯田、浮點(diǎn)型數(shù)組历造、指針數(shù)組和結(jié)構(gòu)數(shù)組等。數(shù)組還可以有一維、二維以及多維等表現(xiàn)形式吭产。 [5]

棧( Stack)

是一種特殊的線性表侣监,它只能在一個表的一個固定端進(jìn)行數(shù)據(jù)結(jié)點(diǎn)的插入和刪除操作。棧按照后進(jìn)先出的原則來存儲數(shù)據(jù)臣淤,也就是說橄霉,先插入的數(shù)據(jù)將被壓入棧底,最后插入的數(shù)據(jù)在棧頂邑蒋,讀出數(shù)據(jù)時姓蜂,從棧頂開始逐個讀出。棧在匯編語言程序中医吊,經(jīng)常用于重要數(shù)據(jù)的現(xiàn)場保護(hù)钱慢。棧中沒有數(shù)據(jù)時,稱為空棧卿堂。 [5]

隊列(Queue)

隊列和棧類似束莫,也是一種特殊的線性表。和棧不同的是草描,隊列只允許在表的一端進(jìn)行插入操作览绿,而在另一端進(jìn)行刪除操作。一般來說穗慕,進(jìn)行插入操作的一端稱為隊尾饿敲,進(jìn)行刪除操作的一端稱為隊頭。隊列中沒有元素時揍诽,稱為空隊列诀蓉。 [5]

鏈表( Linked List)

鏈表是一種數(shù)據(jù)元素按照鏈?zhǔn)酱鎯Y(jié)構(gòu)進(jìn)行存儲的數(shù)據(jù)結(jié)構(gòu),這種存儲結(jié)構(gòu)具有在物理上存在非連續(xù)的特點(diǎn)暑脆。鏈表由一系列數(shù)據(jù)結(jié)點(diǎn)構(gòu)成渠啤,每個數(shù)據(jù)結(jié)點(diǎn)包括數(shù)據(jù)域和指針域兩部分。其中添吗,指針域保存了數(shù)據(jù)結(jié)構(gòu)中下一個元素存放的地址沥曹。鏈表結(jié)構(gòu)中數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序來實(shí)現(xiàn)的。 [5]

樹( Tree)

是典型的非線性結(jié)構(gòu)碟联,它是包括妓美,2個結(jié)點(diǎn)的有窮集合K。在樹結(jié)構(gòu)中鲤孵,有且僅有一個根結(jié)點(diǎn)壶栋,該結(jié)點(diǎn)沒有前驅(qū)結(jié)點(diǎn)。在樹結(jié)構(gòu)中的其他結(jié)點(diǎn)都有且僅有一個前驅(qū)結(jié)點(diǎn)普监,而且可以有兩個后繼結(jié)點(diǎn)贵试,m≥0琉兜。 [5]

圖(Graph)

是另一種非線性數(shù)據(jù)結(jié)構(gòu)。在圖結(jié)構(gòu)中毙玻,數(shù)據(jù)結(jié)點(diǎn)一般稱為頂點(diǎn)豌蟋,而邊是頂點(diǎn)的有序偶對。如果兩個頂點(diǎn)之間存在一條邊桑滩,那么就表示這兩個頂點(diǎn)具有相鄰關(guān)系梧疲。 [5]

堆(Heap)

是一種特殊的樹形數(shù)據(jù)結(jié)構(gòu),一般討論的堆都是二叉堆运准。堆的特點(diǎn)是根結(jié)點(diǎn)的值是所有結(jié)點(diǎn)中最小的或者最大的幌氮,并且根結(jié)點(diǎn)的兩個子樹也是一個堆結(jié)構(gòu)。 [5]

散列表(Hash)

散列表源自于散列函數(shù)(Hash function)戳吝,其思想是如果在結(jié)構(gòu)中存在關(guān)鍵字和T相等的記錄浩销,那么必定在F(T)的存儲位置可以找到該記錄,這樣就可以不用進(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普筹、可見性:是指線程之間的可見性,一個線程修改的狀態(tài)對另一個線程是可見的隘马。

2太防、非原子性:原子是世界上的最小單位,具有不可分割性酸员。

3蜒车、禁止指令重排:在java代碼編譯器可能會出現(xiàn)指令重排的情況,volital可以禁止

25幔嗦、sleep和wait的區(qū)別

https://blog.csdn.net/qq_40531768/article/details/89306532

1酿愧、wait() 方法屬于Object類,sleep屬于Thread類

2邀泉、wait() 方法釋放同步鎖嬉挡,sleep方法不會釋放同步鎖

3、wait() 方法一半與notify() 和notifyAll() 一塊使用

4汇恤、sleep() 方法需要捕獲異常庞钢,而wait() 、notify() 因谎、notifyAll() 不用捕獲

26基括、多態(tài)的幾種寫法

三種:方法的重載,繼承或?qū)崿F(xiàn)接口财岔,父類引用指向子類對象

27阱穗、端口號

oracle:1521

mysql:3306

redis:6379

ES:9200http端口饭冬,9300服務(wù)端口

hdfs:9000

haddop namenode:50070web瀏覽器的訪問端口

28、事務(wù)的隔離級別

https://blog.csdn.net/zhouym_/article/details/90381606

29揪阶、單例的代碼實(shí)現(xiàn)

image.jpeg
image.jpeg

30、什么情況回造成死鎖

https://blog.csdn.net/Crazypokerk_/article/details/89534641?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-1.add_param_isCf&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1.add_param_isCf

循環(huán)等待的時候回造成死鎖

死鎖的產(chǎn)生

首先患朱,明確概念性問題鲁僚,什么是 死鎖(DeadLock)?

所謂死鎖是指多個進(jìn)程因競爭資源而造成的一種僵局(互相等待)裁厅,若無外力作用冰沙,這些進(jìn)程都將無法向前推進(jìn)。死鎖產(chǎn)生的4個必要條件:

  • 互斥條件:進(jìn)程要求對所分配的資源(如打印機(jī))進(jìn)行排他性控制执虹,即在一段時間內(nèi)某 資源僅為一個進(jìn)程所占有拓挥。此時若有其他進(jìn)程請求該資源,則請求進(jìn)程只能等待袋励。
  • 不剝奪條件:進(jìn)程所獲得的資源在未使用完畢之前侥啤,不能被其他進(jìn)程強(qiáng)行奪走,即只能 由獲得該資源的進(jìn)程自己來釋放(只能是主動釋放)茬故。
  • 請求和保持條件:進(jìn)程已經(jīng)保持了至少一個資源盖灸,但又提出了新的資源請求,而該資源 已被其他進(jìn)程占有磺芭,此時請求進(jìn)程被阻塞赁炎,但對自己已獲得的資源保持不放。
  • 循環(huán)等待條件:存在一種進(jìn)程資源的循環(huán)等待鏈钾腺,鏈中每一個進(jìn)程已獲得的資源同時被 鏈中下一個進(jìn)程所請求徙垫。

面試時的典型回答:

死鎖是一種特定的程序狀態(tài),在實(shí)體之間放棒,由于循環(huán)依賴導(dǎo)致彼此一直處于等待之中姻报,沒有任何個體可以繼續(xù)前進(jìn)。死鎖不僅僅是在線程之間會發(fā)生哨查,存在資源獨(dú)占的進(jìn)程之間同樣也可能出現(xiàn)死鎖逗抑。通常來說,我們大多是聚焦在多線程場景中的死鎖寒亥,指兩個或多個線程之間邮府,由于互相持有對方需要的所,而永久處于阻塞的狀態(tài)溉奕。

java怎么定位死鎖:

1褂傀、首先使用jps -l(該命令和linux和ps -ef | grep 很像 java ps)查看當(dāng)前運(yùn)行的java程序,得出程序的進(jìn)程號

2加勤、再使用(jstack 進(jìn)程號) 命令查看結(jié)果找到如下的內(nèi)容:

image.jpeg

31仙辟、為什么java中IO的緩存區(qū)可以提高讀寫效率

https://blog.csdn.net/weixin_30706507/article/details/95891286

調(diào)用I\O操作的時候同波,實(shí)際上還是一個一個的讀或者寫,關(guān)鍵就在叠国,CPU只有一個未檩,不論是幾個核心。CPU在系統(tǒng)調(diào)用時粟焊,會不會還要參與主要操作冤狡?參與多次就會花更多的時間。

系統(tǒng)調(diào)用時项棠,若不用緩沖悲雳,CPU會酌情考慮使用 中斷。此時CPU是主動地香追,每個周期中都要花去一部分去詢問I\O設(shè)備是否讀完數(shù)據(jù)合瓢,這段時間CPU不能做任何其他的事情(至少負(fù)責(zé)執(zhí)行這段模塊的核不能)。所以透典,調(diào)用一次讀了一個字晴楔,通報一次,CPU騰出時間處理一次掷匠。而設(shè)置緩沖滥崩,CPU通常會使用 DMA 方式去執(zhí)行 I\O 操作。CPU 將這個工作交給DMA控制器來做讹语,自己騰出時間做其他的事钙皮,當(dāng)DMA完成工作時,DMA會主動告訴CPU“操作完成”顽决。

這時短条,CPU接管后續(xù)工作。在此才菠,CPU 是被動的茸时。DMA是專門 做 I\O 與 內(nèi)存 數(shù)據(jù)交換的,不僅自身效率高赋访,也節(jié)約了CPU時間可都,CPU在DMA開始和結(jié)束時做了一些設(shè)置罷了。

所以蚓耽,調(diào)用一次渠牲,不必通報CPU,等緩沖區(qū)滿了步悠,DMA 會對C PU 說 “嘿签杈,伙計!快過來看看鼎兽,把他們都搬走吧”答姥。綜上铣除,設(shè)置緩沖,就建立了數(shù)據(jù)塊鹦付,使得DMA執(zhí)行更方便尚粘,CPU也有空閑,而不是呆呆地候著I\O數(shù)據(jù)讀來敲长。從微觀角度來說背苦,設(shè)置緩沖效率要高很多。盡管潘明,不能從這個程序上看出來。 幾萬字的讀寫\就能看到差距秕噪。

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

檢查時異常需要被try catch(SQL異常吓坚,IO異常)

image.jpeg

37、synchronized實(shí)現(xiàn)原理和lock的一些高級用法

①灯荧、synchronized的實(shí)現(xiàn):是java關(guān)鍵字屬于JVM層面的

monitorenter:底層是通過monitor對象來完成礁击,其實(shí)wai t/notify等方法也依賴Fimoni tor對象只有在同步塊或方法中才能漏wait/notify等方法。

monitorexit:退出

image.jpeg

②逗载、Lock是具體類( java. util. concurrent. locks. Lock )是api層面的鎖哆窿,必須手動釋放鎖

2 使用方法

synchronized不需要用戶去手動釋放鎖,當(dāng)synchronized 代碼執(zhí)行完后系統(tǒng)會自動讓線程釋放對鎖的占用

ReentrantLock則需要用戶去手動釋放鎖若沒有主動釋放鎖厉斟,就有可能導(dǎo)致出現(xiàn)死鎖現(xiàn)象挚躯。

需要Lock()和unLock()方法配合try/finally語句塊來完成。

3 等待是否可中斷

synchronized不可中斷擦秽,除非拋出異陈肜螅或者正常運(yùn)行完成

ReentrantLock可中斷, 1.設(shè)置超時方法tryLock(long timeout, TimeUnit unit)

2. lockInterruptibly()放代碼塊中,調(diào)用interrupt() 方法可中斷

4 加鎖是否公平

synchronized非公平鎖

ReentrantLock兩者都可以感挥,默認(rèn)非公平鎖缩搅,構(gòu)造方法可以傳入boolean值, true 為公平鎖,false為 非公平鎖

5 鎖綁定多個條件Condition

synchronized沒有

ReentrantLock用來實(shí)現(xiàn)分組喚醒需要喚醒的線程們链快,可以精確喚醒誉己,而不是像synchronized.要么隨機(jī)喚醒一個線程要 么喚醒全部線程。

synchronizedsynchronized對不同對象加鎖的區(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)建線程池巨双,如果有請求來處理就使用一個線程來處理請求噪猾,如果線程都被占用則放入等待隊列中,這種IO模型屬于偽異步IO模型

NIO:使用Selecter(多路復(fù)用器)和channal

39筑累、樹的遍歷

https://www.pianshen.com/article/7106254596/

樹的遍歷也就是根據(jù)根節(jié)點(diǎn)的先后順序來定義的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末袱蜡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子慢宗,更是在濱河造成了極大的恐慌坪蚁,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镜沽,死亡現(xiàn)場離奇詭異敏晤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)缅茉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門嘴脾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蔬墩,你說我怎么就攤上這事译打。” “怎么了拇颅?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵奏司,是天一觀的道長。 經(jīng)常有香客問我樟插,道長韵洋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任岸夯,我火速辦了婚禮麻献,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘猜扮。我一直安慰自己勉吻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布旅赢。 她就那樣靜靜地躺著齿桃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪煮盼。 梳的紋絲不亂的頭發(fā)上短纵,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機(jī)與錄音僵控,去河邊找鬼香到。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的悠就。 我是一名探鬼主播千绪,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼梗脾!你這毒婦竟也來了荸型?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤炸茧,失蹤者是張志新(化名)和其女友劉穎瑞妇,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梭冠,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辕狰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了控漠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柳琢。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖润脸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情他去,我是刑警寧澤毙驯,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站灾测,受9級特大地震影響爆价,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜媳搪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一铭段、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秦爆,春花似錦序愚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至望门,卻和暖如春形娇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背筹误。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工桐早, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓哄酝,卻偏偏與公主長得像友存,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子炫七,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容