掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
大家好,我是小林。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),市中企業(yè)網(wǎng)站建設(shè),市中品牌網(wǎng)站建設(shè),網(wǎng)站定制,市中網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,市中網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
今天分享一位同學(xué)面試上海某游戲公司的面經(jīng),同學(xué)的技術(shù)棧是Java后端,雖然不是大廠,但是一面面試也被問了 25 多個問題,時長也接近 1 小時了
面試過程中,也問到了 Linux socket 編程,游戲公司都會對網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)編程這一塊要求比較高,所以投游戲公司的同學(xué),需要重點準(zhǔn)備網(wǎng)絡(luò)方面的知識。
還有一點,游戲公司的開發(fā)崗除了技術(shù)要求之外,可能還會問你一下你對游戲的興趣,平常玩什么游戲,對游戲有什么看法,因為工作內(nèi)容就是開發(fā)游戲,如果對游戲沒有熱情,會覺得工作缺失了激情。
balabal 了幾分鐘
說了旁路緩存策略
Redis 有五大基本數(shù)據(jù)類型和四大新類型
五大基本類型是:
每一種數(shù)據(jù)結(jié)構(gòu)根據(jù)自身的特性有不同的使用場景:
計數(shù)器,因為 Redis 是單線程模型的,所以redis執(zhí)行命令時原子性,所以他可以用來做計數(shù)器,例如 點贊計數(shù)、轉(zhuǎn)發(fā)、庫存數(shù)量等
分布式鎖:setnx key value ex 時間
Hash 是 key-value 鍵值對,類似與 Java 的 HashMap, 查找時間復(fù)雜度是 o(l)
Hash 的底層數(shù)據(jù)結(jié)構(gòu)是hashtale 和壓縮表
當(dāng) 元素個小于 512 并且所有元素大小小于 64 字節(jié),采用壓縮列表作為底層數(shù)據(jù)結(jié)構(gòu)
反之采用 hashtable
它適合做購物車,用戶作為 id、商品 id 位 field、商品數(shù)量為 value
List (說到 List 被面試面試官打斷了,下一個)
了解,acid 事務(wù)四大特性說了一遍
讀未提交
讀已提交
可重復(fù)讀
串行話
在可重復(fù)讀隔離級別下,事務(wù) A 第一次執(zhí)行普通的 select 語句時生成了一個 ReadView,之后事務(wù) B 向表中新插入了一條 id = 5 的記錄并提交。接著,事務(wù) A 對 id = 5 這條記錄進(jìn)行了更新操作,在這個時刻,這條新記錄的 trx_id 隱藏列的值就變成了事務(wù) A 的事務(wù) id,之后事務(wù) A 再使用普通 select 語句去查詢這條記錄時就可以看到這條記錄了,于是就發(fā)生了幻讀。
圖片
因為這種特殊現(xiàn)象的存在,所以我們認(rèn)為 MySQL Innodb 中的 MVCC 并不能完全避免幻讀現(xiàn)象。
常規(guī)八股
只有一個核心線程,也是最大線程數(shù)。隊列采用的是 LinkedblockingQueue 無界阻塞隊列。極端情況下會有 OOM 問題
它的工作原理是當(dāng)提交任務(wù)是當(dāng)沒有工作線程時,會將任務(wù)放入到阻塞隊列中,
有核心線程時,獲取阻塞隊列取任務(wù)執(zhí)行,執(zhí)行完了接著從阻塞隊列執(zhí)行
Keepalive存活時間是 0,因為本來就沒有非核心線程
它的場景是串行化的場景,因為他只有一個工作線程
核心線程數(shù)是 0,隊列采用的是 SynchrousQueue 阻塞隊列。最大線程數(shù)是 Integer.Max_value 的默認(rèn)值,KeepAiveTime 是 60 s,也就是線程執(zhí)行完了處于空閑狀態(tài)時,過 60 s 就會銷毀,如果頻繁的創(chuàng)建線程會產(chǎn)生 OOM 問題
它的工作原理是提交任務(wù),沒有線程時,任務(wù)放到阻塞隊列
創(chuàng)建核心線程時取隊列執(zhí)行任務(wù),插入一個元素必須等工作線程取出消費,如果隊列沒有任務(wù)則會阻塞
它的吞吐量比 newFixedExecutor 更高,它適用于并發(fā)量大但是任務(wù)執(zhí)行周期短的場景
newFixedExecutor
SheculedExecutor
周期性去執(zhí)行任務(wù)。隊列是 DeayQueue 延遲隊列,
它的工作原理是 當(dāng)工作線程數(shù)小于最大線程數(shù),首先會去創(chuàng)建線程去執(zhí)行任務(wù)
當(dāng)達(dá)到核心線程數(shù)時,會將任務(wù)放入到阻塞隊列,
所謂周期性就是 他去任務(wù)隊列取出任務(wù)時,會修改一個 time 變量 位下次要執(zhí)行的時間
然后放入到隊列中
發(fā)送數(shù)據(jù)方
不會(我搞 java 的,沒研究過 socket 編程,完了)
剛開始懵逼,后來想到才是 Netty 這個框架
大致分為五個階段,創(chuàng)建前準(zhǔn)備階段、實例化階段、依賴注入階段、容器緩存階段、實例銷毀階段
后面從說了每個階段是干嘛的(面試官反應(yīng)邏輯講的不夠清楚,這里我就不列出來的)
事后復(fù)習(xí)總結(jié)如下:
Spring 啟動后,掃描 @ComponentScan 注解配置的路徑下的所有 .class 文件,
類加載其根據(jù)類名加載獲取類的 Class 對象
判斷類上是否有 @Component、Service 等注解找出 bean 對象
給每個符合條件的 bean 創(chuàng)建 BeanDefintion 對象用于存放 Class 對象、作用域等信息,作用域包括 singletion、prototype、request 等,然后添加進(jìn) beanDefinitionMap, key 值存放 bean 的名字,value 是對應(yīng)的 BeanDefition
掃描 bean 對象
遍歷 beanDefinitionMap,創(chuàng)建
面試官說我們是做游戲開發(fā),然后又問我你平時喜歡打游戲嗎,我說近些年很少打游戲的。以前很喜歡玩,后面覺得膩了,然后面試官說做游戲開發(fā)需要對游戲很了解的,對游戲很熱愛的,否則難干下去
反問環(huán)節(jié)說我基礎(chǔ)還算行,就是可能在業(yè)務(wù)方面可能不匹配
socket編程不太熟悉,計網(wǎng)還需加強學(xué)習(xí)
Spring bean 的生命周期 沒有讓面試官聽懂

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流