Runnable接口和Callable接口
CyclicBarrier和CountDownLatch的區(qū)別
它的執(zhí)行是Java代碼–>字節(jié)碼–>根據字節(jié)碼執(zhí)行對應的C/C++代碼–>C/C++代碼被編譯成匯編語言–>和硬件電路交互碰凶,現實中,為了獲取更好的性能JVM可能會對指令進行重排序,多線程下可能會出現一些意想不到的問題缕溉。使用volatile則會對禁止語義重排序跳昼,當然這也一定程度上降低了代碼執(zhí)行效率
volatile關鍵字的作用:保證可見性汗贫,禁止重排序
如果你的代碼在多線程下執(zhí)行和在單線程下執(zhí)行永遠都能獲得一樣的結果澈圈,那么你的代碼就是線程安全的域携。
lang,util,net,sql,io,concurrent,text
fail-fast機制,它是Java集合的一種錯誤檢測機制棺弊。當多個線程對集合進行結構上的改變的操作時晶密,有可能會產生fail-fast機制。記住是有可能模她,而不是一定稻艰。
方案一:在遍歷過程中所有涉及到改變modCount值得地方全部加上synchronized或者直接使用Collections.synchronizedList,這樣就可以解決侈净。但是不推薦尊勿,因為增刪造成的同步鎖可能會阻塞遍歷操作。
方案二:使用CopyOnWriteArrayList來替換ArrayList畜侦。推薦使用該方案
9元扔、一個線程如果出現了運行時異常會怎么樣
如果這個異常沒有被捕獲的話,這個線程就停止執(zhí)行了夏伊。另外重要的一點是:如果這個線程持有某個某個對象的監(jiān)視器摇展,那么這個對象監(jiān)視器會被立即釋放
阻塞隊列BlockingQueue就是為線程之間共享數據而設計的
11、sleep方法和wait方法有什么區(qū)別
這個問題常問,sleep方法和wait方法都可以用來放棄CPU一定的時間咏连,不同點在于如果線程持有某個對象的監(jiān)視器盯孙,sleep方法不會放棄這個對象的監(jiān)視器,wait方法會放棄這個對象的監(jiān)視器
13祟滴、ThreadLocal有什么用
簡單說ThreadLocal就是一種以空間換時間的做法振惰,在每個Thread里面維護了一個以開地址法實現的ThreadLocal.ThreadLocalMap,把數據進行隔離垄懂,數據不共享骑晶,自然就沒有線程安全方面的問題了
區(qū)塊鏈(Blockchain)是比特幣的一個重要概念,本質上是一個去中心化的數據庫草慧,同時作為比特幣的底層技術桶蛔。區(qū)塊鏈是一串使用密碼學方法相關聯(lián)產生的數據塊,每一個數據塊中包含了一次比特幣網絡交易的信息漫谷,用于驗證其信息的有效性(防偽)和生成下一個區(qū)塊仔雷。
區(qū)塊鏈在網絡上是公開的,可以在每一個離線比特幣錢包數據中查詢舔示。比特幣錢包的功能依賴于與區(qū)塊鏈的確認碟婆,一次有效檢驗稱為一次確認。通常一次交易要獲得數個確認才能進行惕稻。輕量級比特幣錢包使用在線確認竖共,即不會下載區(qū)塊鏈數據到設備存儲中。
區(qū)塊鏈就是把加密數據(區(qū)塊)按照時間順序進行疊加(鏈)生成的永久俺祠、不可逆向修改的記錄公给。
在分布式系統(tǒng)中,同時滿足“CAP定律”中的“一致性”锻煌、“可用性”和“分區(qū)容錯性”三者是不可能的
提到分布式系統(tǒng)妓布,必然要提到分布式事務。要想理解分布式事務宋梧,不得不先介紹一下兩階段提交協(xié)議匣沼。
著名的CAP理論:一致性,可用性捂龄,分區(qū)容忍性释涛,你可以要其中的兩個。
分布式事務倦沧,常見的兩個處理辦法就是兩段式提交和補償唇撬。
兩段式提交典型的就是XA,有個事務協(xié)調器展融,告訴大家窖认,來都準備好提交,大家回復,都準備好了扑浸,然后協(xié)調器告訴大家烧给,一起提交,大家都提交了喝噪。
補償比較好理解础嫡,先處理業(yè)務,然后定時或者回調里酝惧,檢查狀態(tài)是不是一致的榴鼎,如果不一致采用某個策略,強制狀態(tài)到某個結束狀態(tài)(一般是失敗狀態(tài))晚唇,然后就世界太平了巫财。典型的就是沖正操作。
kimmking:淘寶之類的網站一般的做法是哩陕,如果4個都成功才算成功翁涤,那么這次提交時4個寫都設置成一個中間狀態(tài),先容許不一致萌踱。然后4個執(zhí)行完成了以后,回調或是定時任務里檢查這4個數據是不是一致的号阿,如果一致就全部置為成功狀態(tài)并鸵,如果不一致就全部置為失敗。
聯(lián)機事務處理OLTP(on-line transaction processing)主要是執(zhí)行基本的扔涧、日常的事務處理园担,比如數據庫記錄的增、刪枯夜、改弯汰、查。比如在銀行存取一筆款湖雹,就是一個事務交易咏闪。
關系型數據庫通常具有ACID特性:原子性(Atomicity)、一致性(Consistency)摔吏、隔離性(Isolation)鸽嫂、持久性(Durability)。
支付寶開發(fā)的分布式事務是基于兩階段提交的理論(Two Phase Commit)
Phase 1:TM向所有的RM發(fā)送準備請求征讲,RM收到準備請求后据某,進行準備操作,并向TM回復是否可以提交诗箍。
Phase 2:TM收到所有RM的回復后癣籽,如果所有RM均可以提交,向所有RM發(fā)送提交請求,否則發(fā)送回滾請求筷狼。RM根據TM發(fā)送的消息控制本地事務提交或回滾瓶籽。
catch中有return,finally中沒有return桑逝,return的值在執(zhí)行finally之前已經確定下來了棘劣。
悲觀鎖,就是總覺得有刁民想害朕楞遏,每次訪問數據的時候都覺得會有別人修改它茬暇,所以每次拿數據時都會上鎖,確保在自己使用的過程中不會被他人訪問寡喝。樂觀鎖就是很單純糙俗,心態(tài)好,所以每次拿數據的時候都不會上鎖预鬓,只是在更新數據的時候去判斷該數據是否被別人修改過巧骚。
大多數的關系數據庫寫入操作都是基于悲觀鎖,缺點在于如果持有鎖的客戶端運行的很慢格二,那么等待解鎖的客戶端被阻塞的時間就越長劈彪。Redis的事務是基于樂觀鎖的機制,不會在執(zhí)行WATCH命令時對數據進行加鎖顶猜,只是會在數據已經被其他客戶端搶先修改了的情況下沧奴,通知執(zhí)行WATCH命令的客戶端。樂觀鎖適用于讀多寫少的情況长窄,因為在寫操作比較頻繁的時候滔吠,會不斷地retry,從而降低性能挠日。
一般來說疮绷,單例模式有五種寫法:懶漢、餓漢嚣潜、雙重檢驗鎖冬骚、靜態(tài)內部類、枚舉郑原。上述所說都是線程安全的實現
public class Singleton{
//類加載時就初始化
private static final Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
public class Singleton {
private volatile static Singleton instance; //聲明成 volatile
private Singleton (){}
public static Singleton getSingleton() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
public enum EasySingleton{
INSTANCE;
}
MySQL的binlog詳解
binlog日志用于記錄所有更新了數據或者已經潛在更新了數據(例如唉韭,沒有匹配任何行的一個DELETE)的所有語句。語句以“事件”的形式保存犯犁,它描述數據更改属愤。
因為有了數據更新的binlog,所以可以用于實時備份酸役,與master/slave復制
ElasticSearch是一個基于Lucene的搜索服務器住诸。它提供了一個分布式多用戶能力的全文搜索引擎驾胆,基于RESTful web接口。Elasticsearch是用Java開發(fā)的贱呐,并作為Apache許可條款下的開放源碼發(fā)布丧诺,是當前流行的企業(yè)級搜索引擎。設計用于云計算中奄薇,能夠達到實時搜索驳阎,穩(wěn)定,可靠馁蒂,快速呵晚,安裝使用方便。
=======================
JVM沫屡,JMM饵隙,GC,反射沮脖,內存相關
多線程金矛,NIO
數據結構與算法
數據庫相關
框架相關,分布式事務
當下熱點