摘要:阿里開始招實(shí)習(xí),同學(xué)問我要不要去申請(qǐng)阿里的實(shí)習(xí),我說不去,個(gè)人對(duì)阿里的印象不好。記得去年阿里給我發(fā)了郵件,我很認(rèn)真地回復(fù),然后他不理我了。
引言
最近好久沒有遇到技術(shù)瓶頸了,思考得自然少了,每天都是重復(fù)性的工作。
阿里開始招實(shí)習(xí),同學(xué)問我要不要去申請(qǐng)阿里的實(shí)習(xí),我說不去,個(gè)人對(duì)阿里的印象不好。
記得去年阿里給我發(fā)了郵件,我很認(rèn)真地回復(fù),然后他不理我了。(最起碼的尊重都沒有,就算我菜你起碼回復(fù)我一下???)
這種不尊重人的公司感覺去了也不快樂,當(dāng)程序員最重要的就是快樂,不快樂寫什么代碼?
電話面同學(xué)很友好地分享了他的阿里電話面經(jīng)驗(yàn)。
問的都是看功底的問題,和開發(fā)經(jīng)驗(yàn)無關(guān)(估計(jì)寫上個(gè)幾年代碼不寫框架應(yīng)該也不知道這個(gè))。
Java中的HashMap、transient、volatile、HTTP301/302、生產(chǎn)者消費(fèi)者算法。
HashMap都問爛了,問的是HashMap的底層原理,我知道你們自己寫過JDK,請(qǐng)不要再問我HashMap里的put操作是怎么實(shí)現(xiàn)的了!
問源碼的真的很討厭,有什么意義嗎?看過的就能答上,沒看過的就答不上。
基礎(chǔ)學(xué)習(xí) transient這并不是第一次聽到transient這個(gè)詞了,之前也用過,當(dāng)我們使用YunzhiService進(jìn)行綜合查詢時(shí),我們會(huì)在實(shí)體中構(gòu)造不映射到數(shù)據(jù)表的屬性用于查詢。
對(duì)于這些不映射為數(shù)據(jù)表字段的屬性,我們使用@Transient注解。
那Java中被transient修飾又是什么意思呢?
為什么要有transient?StackOverflow的解釋通俗易懂。
The transient keyword in Java is used to indicate that a field should not be part of the serialization (which means saved, like to a file) process.
Java中的transient關(guān)鍵字,意味著該字段不參與序列化,意味著不被保存,例如輸出到文件中。
序列化?fastjson應(yīng)該用到了這個(gè)關(guān)鍵字。
厲害厲害,fastjson開發(fā)團(tuán)隊(duì)基本功扎實(shí)。
volatile這個(gè)關(guān)鍵字也不知道怎么能給大家通俗的講出來,還是從實(shí)際的小例子出發(fā)吧?
大家回憶一下我們之前的單例模式,單例模式很常用,這個(gè)是必須要會(huì)的。
這是有問題的懶漢模式,多線程的時(shí)候就不能保持單例了。
public class Singleton { private static Singleton instance; private Singleton() { } public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }修正之前的問題
糾正一下之前博客中的一個(gè)問題,之前這樣寫雖然也能實(shí)現(xiàn),但是效率極低,因?yàn)槊看?b>getInstance的時(shí)候都會(huì)被synchronized阻塞。
public class Singleton { private static Singleton instance; private Singleton() { } public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
為了效率,不能在方法上加鎖,所以需要在新建單例的時(shí)候加鎖,保證只要只有一個(gè)單例被new出來。
看起來是沒問題的,因?yàn)槲覀兿氘?dāng)然的以為,一個(gè)線程new出來的Singleton,賦值給instance,然后另一個(gè)線程獲取到的instance就一定不是空。實(shí)際上呢?
CPU結(jié)構(gòu)讓我們來看Youtube上的一張圖:
在CPU內(nèi)部結(jié)構(gòu)中,thread-1和thread-2運(yùn)行在不同的核心上,每個(gè)核心有一個(gè)local cache,兩個(gè)線程執(zhí)行時(shí),會(huì)將變量從shared cache讀取到local cache。
所以thread-1把flag內(nèi)容改變了,但是thread-2獲取的flag還是從local cache中獲取的,所以還是true。
直到,thread-1的flag更新到shared cache,然后再更新到thread-2的local cache,thread-2才知道flag變了。
所以我們的單例也一樣,線程A新建了單例,然后其他線程再獲取的時(shí)候,不一定是線程A所創(chuàng)建的單例對(duì)象。
拯救世界volatile來拯救世界了。
private static volatile Singleton instance;
volatile做了兩件事,強(qiáng)制將local cache寫入到shared cache,同時(shí)使其他核心中的local cache對(duì)該數(shù)據(jù)的緩存無效。
所以,完整的單例應(yīng)該是這樣:
public class Singleton { private static volatile Singleton instance; private Singleton() { } public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }真正的單例
上面的講解只是為了讓大家了解Java中volatile的作用,實(shí)際的單例并不這樣實(shí)現(xiàn),而是使用私有靜態(tài)內(nèi)部類實(shí)現(xiàn)懶漢模式,當(dāng)訪問getInstance方法時(shí),才加載Holder類,實(shí)例化單例。
public class Singleton { private static class Holder { private static Singleton instance = new Singleton(); } private Singleton() { } public static Singleton getInstance() { return Holder.instance; } }
呼,長出了一口氣,兩個(gè)晚上了,總算把volatile自己學(xué)會(huì)然后講明白了,這個(gè)應(yīng)該是發(fā)生的概率很小很小,我為了讓volatile的驗(yàn)證讓大家都看到,使用JDK自帶的線程池,模擬實(shí)際的多線程環(huán)境,分別執(zhí)行自己的測(cè)試代碼,但還是沒出現(xiàn)問題。
HTTP 301/302去火狐開發(fā)者文檔看看:
301 Moved Permanently
永久重定向,請(qǐng)求的資源已經(jīng)被移動(dòng)到了由Location頭部指定的url上,搜索引擎會(huì)根據(jù)該響應(yīng)修正。
HTTP升級(jí)到HTTPS時(shí)應(yīng)該能用到。
302 Found
臨時(shí)重定向,請(qǐng)求的資源被暫時(shí)的移動(dòng)到了由Location頭部指定的url上。瀏覽器會(huì)重定向到這個(gè)url,但是搜索引擎不會(huì)對(duì)該資源的鏈接進(jìn)行更新。
可能會(huì)在某個(gè)后臺(tái)服務(wù)癱瘓的時(shí)候再轉(zhuǎn)給別的后臺(tái)服務(wù)器時(shí)用到?
生產(chǎn)者消費(fèi)者至于最后的生產(chǎn)者消費(fèi)者算法問題,我覺得意義不大,畢竟操作系統(tǒng)的課本出自七位河北工業(yè)大學(xué)操作系統(tǒng)教師之手。
JDK中有阻塞隊(duì)列,用的就是生產(chǎn)者消費(fèi)者模型。用到的時(shí)候再說吧。
總結(jié)每個(gè)人都是優(yōu)秀的人,每個(gè)人都值得尊敬。
軟件生而自由,不受世俗污染,不受凡塵打擾,我祝愿每一位軟件工程師都能生活在自由、快樂之中。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/73963.html
摘要:探究系統(tǒng)登錄驗(yàn)證碼的實(shí)現(xiàn)后端掘金驗(yàn)證碼生成類手把手教程后端博客系統(tǒng)第一章掘金轉(zhuǎn)眼間時(shí)間就從月份到現(xiàn)在的十一月份了。提供了與標(biāo)準(zhǔn)不同的工作方式我的后端書架后端掘金我的后端書架月前本書架主要針對(duì)后端開發(fā)與架構(gòu)。 Spring Boot干貨系列總綱 | 掘金技術(shù)征文 - 掘金原本地址:Spring Boot干貨系列總綱博客地址:http://tengj.top/ 前言 博主16年認(rèn)識(shí)Spin...
摘要:框架具有輕便,開源的優(yōu)點(diǎn),所以本譯見構(gòu)建用戶管理微服務(wù)五使用令牌和來實(shí)現(xiàn)身份驗(yàn)證往期譯見系列文章在賬號(hào)分享中持續(xù)連載,敬請(qǐng)查看在往期譯見系列的文章中,我們已經(jīng)建立了業(yè)務(wù)邏輯數(shù)據(jù)訪問層和前端控制器但是忽略了對(duì)身份進(jìn)行驗(yàn)證。 重拾后端之Spring Boot(四):使用JWT和Spring Security保護(hù)REST API 重拾后端之Spring Boot(一):REST API的搭建...
摘要:前言今天,我將梳理在網(wǎng)絡(luò)編程中很重要的一個(gè)類以及其相關(guān)的類。這類主機(jī)通常不需要外部互聯(lián)網(wǎng)服務(wù),僅有主機(jī)間相互通訊的需求??梢酝ㄟ^該接口獲取所有本地地址,并根據(jù)這些地址創(chuàng)建。在這里我們使用阻塞隊(duì)列實(shí)現(xiàn)主線程和打印線程之間的通信。 前言 今天,我將梳理在Java網(wǎng)絡(luò)編程中很重要的一個(gè)類InetAddress以及其相關(guān)的類NetworkInterface。在這篇文章中將會(huì)涉及: InetA...
摘要:也就是說我們操作的幾何公式中的未知變量,而具體的畫圖操作則由渲染引擎處理,而不是我們苦苦哀求設(shè)計(jì)師幫忙。 前言 ?當(dāng)CSS3推出border-radius屬性時(shí)我們是那么欣喜若狂啊,一想到終于不用再添加額外元素來模擬圓角了,但發(fā)現(xiàn)border-radius還分水平半徑和垂直半徑,然后又發(fā)現(xiàn)border-top-left/right-radius的水平半徑之和大于元素寬度時(shí),實(shí)際值會(huì)按比...
摘要:接下來繼續(xù)介紹三種架構(gòu)模式,分別是查詢分離模式微服務(wù)模式多級(jí)緩存模式。分布式應(yīng)用程序可以基于實(shí)現(xiàn)諸如數(shù)據(jù)發(fā)布訂閱負(fù)載均衡命名服務(wù)分布式協(xié)調(diào)通知集群管理選舉分布式鎖和分布式隊(duì)列等功能。 SpringCloud 分布式配置 SpringCloud 分布式配置 史上最簡(jiǎn)單的 SpringCloud 教程 | 第九篇: 服務(wù)鏈路追蹤 (Spring Cloud Sleuth) 史上最簡(jiǎn)單的 S...
閱讀 2471·2021-11-23 09:51
閱讀 1273·2021-11-22 13:54
閱讀 3500·2021-09-24 10:31
閱讀 1187·2021-08-16 10:46
閱讀 3710·2019-08-30 15:54
閱讀 770·2019-08-30 15:54
閱讀 2952·2019-08-29 17:17
閱讀 3247·2019-08-29 15:08