java 基礎(chǔ)

什么情況下會(huì)發(fā)生死鎖

出現(xiàn)死鎖,有這四個(gè)必要條件:互斥條件、請(qǐng)求和保持、不可剝奪、循環(huán)等待

  1. 互斥條件: 一個(gè)資源每次只能被一個(gè)進(jìn)程使用,即在一段時(shí)間內(nèi)某 資源僅為一個(gè)進(jìn)程所占有。此時(shí)若有其他進(jìn)程請(qǐng)求該資源,則請(qǐng)求進(jìn)程只能等待。
  1. 請(qǐng)求與保持條件: 進(jìn)程已經(jīng)保持了至少一個(gè)資源,但又提出了新的資源請(qǐng)求,而該資源 已被其他進(jìn)程占有,此時(shí)請(qǐng)求進(jìn)程被阻塞,但對(duì)自己已獲得的資源保持不放。
  1. 不可剝奪條件: 進(jìn)程所獲得的資源在未使用完畢之前,不能被其他進(jìn)程強(qiáng)行奪走,即只能 由獲得該資源的進(jìn)程自己來(lái)釋放(只能是主動(dòng)釋放)。
  1. 循環(huán)等待條件: 若干進(jìn)程間形成首尾相接循環(huán)等待資源的關(guān)系

只要系統(tǒng)發(fā)生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會(huì)發(fā)生死鎖

java模擬死鎖

public class DeadLockTest{

    public static void main(String[] args) {
        Thread t1 = new Thread(new DeadLock(1));
        Thread t2 = new Thread(new DeadLock(2));
        t1.start();
        t2.start();
    }

}

class DeadLock implements Runnable{

    private int flag;

    private static Object o1 = new Object();
    private static Object o2 = new Object();

    DeadLock(int _flag){
        this.flag = _flag;
    }

    @Override
    public void run() {
        System.out.println("flag: " + flag);
        if(flag == 1){
            synchronized(o1){
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized(o2){
                    System.out.println("1");
                }
            }
        }
        else if(flag == 2){
            synchronized(o2){
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized(o1){
                    System.out.println("2");
                }
            }
        }
    }
}

JVM gc算法

哪些對(duì)象該被GC? 如果一個(gè)對(duì)象到GC Roots沒(méi)有任何引用鏈,該對(duì)象就是不可達(dá)對(duì)象,即可以被GC。

一、標(biāo)記清除算法(Mark-and-Sweep)

標(biāo)記清除算法是最基礎(chǔ)的收集算法,后面的算法都是基于該算法擴(kuò)展的,分為兩個(gè)階段:
標(biāo)記階段(Mark phase):
從GC Roots出發(fā),沿著引用鏈,遇到對(duì)象就標(biāo)記該對(duì)象,直到所有可達(dá)對(duì)象都被標(biāo)記。
清除階段(Sweep phase):
掃描整個(gè)heap,回收那些在標(biāo)記階段未被標(biāo)記的對(duì)象的內(nèi)存

二、停止復(fù)制算法(Stop-and-Copy)

停止復(fù)制算法將可用內(nèi)存分為等量的兩塊,每次只使用其中的一塊,當(dāng)這一塊無(wú)法滿足新的內(nèi)存分配時(shí),即需要GC時(shí),就掃描該塊,將還存活的對(duì)象復(fù)制到另一塊上面,然后再把已使用過(guò)的內(nèi)存空間一次清理掉。

三、標(biāo)記整理(壓縮)算法(Mark-and-Compact)

標(biāo)記整理算法和標(biāo)記清理算法類似,也分為兩個(gè)階段:
標(biāo)記階段(Mark):從GC Roots出發(fā),沿著引用鏈,遇到對(duì)象就標(biāo)記該對(duì)象,直到所有可達(dá)對(duì)象都被標(biāo)記。
整理(壓縮)階段(Compact):把所有的存活對(duì)象往一端移,然后清理掉端邊界外的內(nèi)存。

注意:無(wú)論是哪種算法哪種收集器,在枚舉根節(jié)點(diǎn)時(shí)都是要停頓(停頓指得是暫停所有用戶線程),只是根據(jù)算法的不同以及收集器的不同該停頓時(shí)間的長(zhǎng)短不同而已。

MySQL存儲(chǔ)引擎有哪幾種,各有什么特點(diǎn)

TODO

redis如何從左向右刪除list元素

TODO

Spring MVC 一個(gè)請(qǐng)求處理流程

Spring MVC工作流程圖

Spring工作流程描述

  1. 用戶向服務(wù)器發(fā)送請(qǐng)求,請(qǐng)求被Spring 前端控制Servelt DispatcherServlet捕獲;
  1. DispatcherServlet對(duì)請(qǐng)求URL進(jìn)行解析,得到請(qǐng)求資源標(biāo)識(shí)符(URI)。然后根據(jù)該URI,調(diào)用HandlerMapping獲得該Handler配置的所有相關(guān)的對(duì)象(包括Handler對(duì)象以及Handler對(duì)象對(duì)應(yīng)的攔截器),最后以HandlerExecutionChain對(duì)象的形式返回;
  2. DispatcherServlet 根據(jù)獲得的Handler,選擇一個(gè)合適的HandlerAdapter。(附注:如果成功獲得HandlerAdapter后,此時(shí)將開(kāi)始執(zhí)行攔截器的preHandler(...)方法)
  3. 提取Request中的模型數(shù)據(jù),填充Handler入?yún)ⅲ_(kāi)始執(zhí)行Handler(Controller)。 在填充Handler的入?yún)⑦^(guò)程中,根據(jù)你的配置,Spring將幫你做一些額外的工作:

    HttpMessageConveter: 將請(qǐng)求消息(如Json、xml等數(shù)據(jù))轉(zhuǎn)換成一個(gè)對(duì)象,將對(duì)象轉(zhuǎn)換為指定的響應(yīng)信息
    數(shù)據(jù)轉(zhuǎn)換:對(duì)請(qǐng)求消息進(jìn)行數(shù)據(jù)轉(zhuǎn)換。如String轉(zhuǎn)換成Integer、Double等
    數(shù)據(jù)根式化:對(duì)請(qǐng)求消息進(jìn)行數(shù)據(jù)格式化。 如將字符串轉(zhuǎn)換成格式化數(shù)字或格式化日期等
    數(shù)據(jù)驗(yàn)證: 驗(yàn)證數(shù)據(jù)的有效性(長(zhǎng)度、格式等),驗(yàn)證結(jié)果存儲(chǔ)到BindingResult或Error中

    1. Handler執(zhí)行完成后,向DispatcherServlet 返回一個(gè)ModelAndView對(duì)象;
    2. 根據(jù)返回的ModelAndView,選擇一個(gè)適合的ViewResolver(必須是已經(jīng)注冊(cè)到Spring容器中的ViewResolver)返回給DispatcherServlet ;
    3. ViewResolver 結(jié)合Model和View,來(lái)渲染視圖
    4. 將渲染結(jié)果返回給客戶端。

向zookeeper集群寫(xiě)數(shù)據(jù),內(nèi)部流程

TODO

Overload和Override的區(qū)別

HashMap和Hashtable有什么區(qū)別

sleep() 和 wait() 有什么區(qū)別

ArrayList和LinkedList有什么區(qū)別

System.gc()和Runtime.gc()會(huì)做什么事情

談?wù)凧AVA中的集合

JVM的理解、GC工作機(jī)制詳解

Java對(duì)象的生命周期

Map或者HashMap的存儲(chǔ)原理

HashMap是由數(shù)組+鏈表的一個(gè)結(jié)構(gòu)組成

當(dāng)數(shù)據(jù)表中A、B字段做了組合索引,那么單獨(dú)使用A或單獨(dú)使用B會(huì)有索引效果嗎?(使用like查詢?nèi)绾斡兴饕Ч?/h4>

HTTP協(xié)議,GET和POST 的區(qū)別

數(shù)據(jù)庫(kù)中char, varchar, nvarchar的差異

spring的理解

hibernate與mybitis的區(qū)別

你的接口服務(wù)數(shù)據(jù)被人截包了,你如何防止數(shù)據(jù)惡意提交?

你的所做過(guò)的項(xiàng)目和你的設(shè)計(jì)思路如何?

談?wù)勀銓?duì)分布式的理解

如何看待設(shè)計(jì)模式,并簡(jiǎn)單說(shuō)說(shuō)你所熟悉模式的理解.

日常項(xiàng)目中,如果你接手,你準(zhǔn)備從哪些方面調(diào)優(yōu)?

web如何項(xiàng)目?jī)?yōu)化

項(xiàng)目并發(fā)如何處理?(我們是web項(xiàng)目)

簡(jiǎn)單說(shuō)說(shuō)數(shù)據(jù)庫(kù)集群和負(fù)載均衡、分布式

集群環(huán)境中,session如何實(shí)現(xiàn)共享

分布式、集群環(huán)境中,緩存如何刷新,如何保持同步?

緩存如何保持同步? 這個(gè)redis有自帶的集群同步機(jī)制,即復(fù)制功能,具體參考:基于Redis分布式緩存實(shí)現(xiàn) ,Ehcache也有分布式緩存同步的配置,只需要配置不同服務(wù)器地址即可,參照:Ehcache分布式緩存同步

一條sql執(zhí)行過(guò)長(zhǎng)的時(shí)間,你如何優(yōu)化,從哪些方面?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,923評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,951評(píng)論 6 342
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,366評(píng)論 11 349
  • 1、實(shí)例方法和靜態(tài)方法有什么不一樣? 答:實(shí)例方法只能在其類下調(diào)用,而靜態(tài)方法可以直接調(diào)用。 答:1、在外部調(diào)用靜...
    眼袋大大閱讀 918評(píng)論 0 7
  • 2017.08.02,晴。 晚上,我和女兒掃了兩輛小黃車,這個(gè)ofo可以把座椅放低,是最安全的一種。 贛州目前有三...
    高山雪原閱讀 385評(píng)論 0 0