摘要:并發(fā)處理書摘第一,線程必須通過(guò)線程池來(lái)提供,不允許顯式創(chuàng)建線程。具體行鎖,表鎖大家可以自行百度了解。因?yàn)樗嵌x的標(biāo)準(zhǔn)統(tǒng)計(jì)行數(shù)的預(yù)發(fā)。二者得保留事故服務(wù)器現(xiàn)場(chǎng)。最后感謝小冊(cè)子阿里巴巴開發(fā)手冊(cè),感覺(jué)不錯(cuò)。
摘要: 原創(chuàng)出處 https://www.bysocket.com 「公眾號(hào):泥瓦匠BYSocket 」歡迎關(guān)注和轉(zhuǎn)載,保留摘要,謝謝!
一個(gè)優(yōu)秀的工程師和一個(gè)普通的工程師的區(qū)別,不是滿天飛的架構(gòu)圖,他的功底體現(xiàn)在所寫的每一行代碼上。
-- 畢玄
【書摘】類名用 UpperCamelCase 風(fēng)格,比如 DO/BO/VO/PO
【書摘】方法用 lowerCamelCase 風(fēng)格,盡量是動(dòng)詞
小思考:例如常用的
獲取單個(gè)對(duì)象,getUserById
獲取對(duì)象累不,listUserByGroupId
統(tǒng)計(jì)對(duì)象數(shù)量,countUserByClassId
新增、刪除,insert,delete,update 等
2. 常量定義【書摘】如果變量值僅在一個(gè)范圍變化,則用 enum 類型
小思考:例如電商中訂單狀態(tài),用手指也能列出來(lái)。所以一般定義個(gè) OrderSatausEnum 搞定,偽代碼如下:
public enum OrderSatausEnum { TO_PAY(1,"代付款"), PAID(2,"已付款") ...; private Integer orderStatus; private String orderSatausDes; OrderSatausEnum(Integer orderStatus,String orderSatausDes) { this.orderStatus = orderStatus; this.orderSatausDes = orderSatausDes; } // get set }
進(jìn)一步,如果訂單某天要加個(gè)“待拼團(tuán)”狀態(tài)咋辦?所以這些配置化的東西,可以上配置中心。比如攜程出的 apollo 等
3. OOP 規(guī)則【書摘】Object 的 equals 方法容易拋空指針異常,應(yīng)使用常量或者確定優(yōu)質(zhì)的對(duì)象來(lái)調(diào)用 equals 。
比如:“TO_PAY”.equals(order.getOrderStatus())。反著寫就不對(duì)了,因?yàn)?order.getOrderStatus() 可能為 null。
自然,更加推薦 java.util.Objects#equals 工具類。
【書摘】所有相同類型的包裝類對(duì)象之間的值比較,全部使用 equals 方法。
小思考:別用 == 了。equals 也要注意些事情,比如 Byte 類型的 status 對(duì)象值,用 equals 要注意如下:
getStatus().equals(0) // 反例,false getStatus().equals((byte)0) // 正例,true
還有, == 比如 Integer 在 -128 到 127 范圍比較正常,超過(guò)就不正常。原因是 -128 到 127 范圍的對(duì)象在 IntegerCache.cache 中產(chǎn)生,會(huì)復(fù)用對(duì)象。所以所以,切記切記,別用 == 了,用 equals 去比較。
4. 集合處理【書摘】不要在 for 循環(huán)中進(jìn)行元素的 remove/add 操作。remove 請(qǐng)使用 Iterator 方法,如果有并發(fā)操作,則對(duì) Iterator 對(duì)象加鎖。
具體 Iterator 怎么操作集合,百度下即可。這還是典型的 迭代器設(shè)計(jì)模式,可以深入源碼看看人家的簡(jiǎn)單實(shí)現(xiàn)原理,又能學(xué)到一發(fā)高級(jí)知識(shí)。
5. 并發(fā)處理【書摘】第一,線程必須通過(guò)線程池來(lái)提供,不允許顯式創(chuàng)建線程。第二,線程池不允許用 Executors 創(chuàng)建,應(yīng)使用 ThreadPoolExecutor 去創(chuàng)建。因?yàn)?br>Executors 創(chuàng)建的幾種 ThreadPool 會(huì)有弊端:
FixedThreadPool 和 SingleThreadPool 允許請(qǐng)求隊(duì)列長(zhǎng)度為 Integer.MAX_VALUE ,大量請(qǐng)求,會(huì)導(dǎo)致 OOM
CachedThreadPool 和 ScheduledThreadPool 允許創(chuàng)建最大的線程數(shù)為 Integer.MAX_VALUE,大量創(chuàng)建線程,會(huì)導(dǎo)致 OOM
所以,使用 ThreadPoolExecutor 的原因是能更好地理解線程池的運(yùn)行規(guī)則,規(guī)避資源耗盡,更好地貼合某個(gè)業(yè)務(wù)場(chǎng)景,去創(chuàng)建更適合的線程池。
*
【書摘】在高并發(fā)場(chǎng)景中,同步調(diào)用應(yīng)該考慮鎖的性能損耗。能用無(wú)鎖數(shù)據(jù)結(jié)構(gòu),就不要用鎖;能鎖區(qū)塊,就不要鎖整個(gè)方法體;能用對(duì)象鎖,就不要用類鎖。即,加鎖的粒度越小,性能損耗越小。并且避免鎖的代碼塊中調(diào)用了 RPC 方法。
另外,同時(shí)對(duì)多個(gè)資源加鎖的時(shí)候,需要保持一致的加鎖順序。否則,一個(gè)線程加鎖順序?yàn)?ABC,另一個(gè)加鎖順序?yàn)?ACB 或 BAC 等,會(huì)造成死鎖。如圖:
*
【書摘】金融資金相關(guān)信息,使用悲觀鎖。比如更新某個(gè)用戶的錢包余額字段。
小思考:我以前做 P2P 的時(shí)候,就很簡(jiǎn)單地使用了 MySQL 的行鎖。
SELECT * FROM xx WHREER xx.id=888 FOR UPDATE
具體行鎖,表鎖大家可以自行百度了解。
6. 控制語(yǔ)句【書摘】高并發(fā)場(chǎng)景,比如秒殺場(chǎng)景,商品扣庫(kù)存,庫(kù)存的判斷不要用“等于”來(lái)判斷商品庫(kù)存已售罄的條件。應(yīng)使用大于或者小于的條件來(lái)代替。
小思考:這是典型的超賣場(chǎng)景。有人會(huì)問(wèn)也會(huì)存在超賣幾件的問(wèn)題吧?答案是是的。但如果用 等于 來(lái)判斷,超賣的件數(shù)會(huì)很多很多,比如達(dá)到 1 萬(wàn)件。但超賣 1 萬(wàn)件和超賣 1 件是不一樣等級(jí)的故障。或者是一個(gè)故障和一個(gè)不是故障的區(qū)別。
7.異常處理【書摘】異常不要用來(lái)做流程控制,條件控制
小思考:昨天京東小哥問(wèn)我,這個(gè)能這么搞降級(jí)嗎?如下代碼:
try { searchFromES() }catch(){ searchFromDB() }
這不算降級(jí),這也不能這么搞。第一,代碼這也寫就不對(duì),異常不要用來(lái)做流程控制,條件控制。第二,這個(gè)只要實(shí)現(xiàn) ES 讀取有問(wèn)題,讀取不到就讀 DB??梢钥紤]責(zé)任鏈設(shè)計(jì)模式去實(shí)現(xiàn)。偽代碼如下:
ESHandle { void handle() { try { searchFromES() }catch(){ } } } DBHandle { void handle() { try { searchFromES() }catch(){ } } } // 兩個(gè) Handle 利用責(zé)任鏈去實(shí)現(xiàn)即可。8. 建表規(guī)約 、SQL 語(yǔ)句
【書摘】當(dāng)單表行數(shù)超過(guò) 500 萬(wàn)行或者單表容量超過(guò) 2 GB時(shí),才推薦進(jìn)行分庫(kù)分表。
如果預(yù)計(jì)三年后的數(shù)量級(jí)無(wú)法達(dá)到這個(gè)級(jí)別,請(qǐng)不要在創(chuàng)建表時(shí)就分庫(kù)分表。
*
【書摘】不要使用 count(列名) 或者 count(常量) 來(lái)替代 count(*)。 因?yàn)樗?SQL92 定義的標(biāo)準(zhǔn)統(tǒng)計(jì)行數(shù)的預(yù)發(fā)。它會(huì)統(tǒng)計(jì) NULL 的行。
*
【書摘】where 條件下里面的 in 能避免就避免,要注意 in 里面的集合數(shù)量,控制在 1000 個(gè)之內(nèi)。
*
【書摘】在代碼中寫分頁(yè)查詢,如果 count 為 0 ,直接返回 空列表。避免執(zhí)行下面的分頁(yè)語(yǔ)句。
9.服務(wù)器【書摘】高并發(fā)服務(wù)器建議調(diào)小 TCP 協(xié)議的 time_wait 超時(shí)時(shí)間。Linux 修改 /etc/sysctl.conf 文件,代碼如下:
net.ipv4.tcp_fin_timeout = 30
*
【書摘】JVM 設(shè)置參數(shù) -XX:+HeapDumpOnOutOfMemoryError。讓 JVM 碰到 OOM 的時(shí)候,輸出 dump 信息。
小思考:這個(gè)很重要。二者得保留事故服務(wù)器現(xiàn)場(chǎng)。比如 OOM 了某個(gè)服務(wù)器,則在 VIP 或者啥摘到該機(jī)器,讓該機(jī)器不再有請(qǐng)求進(jìn)入。然后去查看 dump 信息,去排查 OOM 問(wèn)題。
最后感謝小冊(cè)子《阿里巴巴 Java 開發(fā)手冊(cè)》,感覺(jué)不錯(cuò)。至少其中有幾點(diǎn),有目共睹的。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/74051.html
摘要:第四章總結(jié)最后的章節(jié)其實(shí)是一些自學(xué)路上的建議與避免小白走錯(cuò)路的坑。結(jié)語(yǔ)感謝作者的分享,也看出作者在行業(yè)的豐富經(jīng)驗(yàn),同時(shí)此書確實(shí)很適合小白閱讀,閱讀輕松而且沒(méi)有太多專業(yè)性詞匯,讓很多人都能對(duì)有一個(gè)大致的概念。 博客 貓叔的博客 前言 年前部門一次性購(gòu)買了一批書,我知道這次我應(yīng)該會(huì)被指派閱讀一些偏向于管理類的書籍,但是沒(méi)想到美女領(lǐng)導(dǎo)直接給了我這本書《快速轉(zhuǎn)行做產(chǎn)品經(jīng)理》,其實(shí)一開始我有點(diǎn)...
摘要:開發(fā)流程對(duì)于一個(gè)項(xiàng)目,最大的問(wèn)題就是如何拆解為任務(wù),分配到合適的人手里,并在有限的時(shí)間內(nèi)完成它。但是我們把整個(gè)項(xiàng)目進(jìn)行拆解的話,每個(gè)星期進(jìn)行統(tǒng)計(jì)分析,就可以對(duì)癥下藥,提高開發(fā)效率。 開發(fā)流程 對(duì)于一個(gè)項(xiàng)目,最大的問(wèn)題就是如何拆解為任務(wù),分配到合適的人手里,并在有限的時(shí)間內(nèi)完成它。 就像做建筑工程一樣,其實(shí)做IT也是可以量化的,可能有的人砌磚砌得慢一些,有的人快一些。 但是我們把整個(gè)項(xiàng)目...
摘要:關(guān)于認(rèn)證考試手冊(cè)發(fā)布之際,阿里巴巴開發(fā)規(guī)范認(rèn)證考試也同步上線,通過(guò)在線考試,檢測(cè)你對(duì)手冊(cè)中開發(fā)規(guī)范的掌握程度,并發(fā)放官方認(rèn)證證書。認(rèn)證考試致謝阿里巴巴開發(fā)規(guī)范能夠成冊(cè),離不開集團(tuán)內(nèi)移動(dòng)開發(fā)工程師的大力支持,在此感謝大家的無(wú)私奉獻(xiàn)和付出。 春節(jié)余味尚未消,我們?yōu)橐苿?dòng)開發(fā)者準(zhǔn)備了一份遲到的新年禮物——《阿里巴巴Android開發(fā)手冊(cè)》,繼《阿里巴巴Java開發(fā)手冊(cè)》之后,阿里巴巴開發(fā)規(guī)范家...
摘要:熟悉和遵守阿里巴巴開發(fā)手冊(cè)的編程風(fēng)格,那只是標(biāo),而代碼可讀性的本可以追溯到軟件設(shè)計(jì)階段。何為條設(shè)計(jì)規(guī)約是根據(jù)阿里巴巴實(shí)際項(xiàng)目架構(gòu)經(jīng)驗(yàn)提煉而成,共條。本次新增的不單是條新的設(shè)計(jì)規(guī)約,還是千萬(wàn)阿里人的技術(shù)之心。 摘要:2018年6月,《阿里巴巴Java開發(fā)手冊(cè)》再次刷新代碼規(guī)范認(rèn)知,我們新增了16條設(shè)計(jì)規(guī)約!現(xiàn)免費(fèi)開放下載,不可錯(cuò)過(guò)!《阿里巴巴Java開發(fā)手冊(cè)》是阿里內(nèi)部Java工程師所遵...
閱讀 2571·2021-11-22 09:34
閱讀 932·2021-11-19 11:34
閱讀 2801·2021-10-14 09:42
閱讀 1472·2021-09-22 15:27
閱讀 2385·2021-09-07 09:59
閱讀 1731·2021-08-27 13:13
閱讀 3432·2019-08-30 11:21
閱讀 771·2019-08-29 18:35