Runnable接口和Callable接口
CyclicBarrier和CountDownLatch的區(qū)別
它的執(zhí)行是Java代碼–>字節(jié)碼–>根據(jù)字節(jié)碼執(zhí)行對應(yīng)的C/C++代碼–>C/C++代碼被編譯成匯編語言–>和硬件電路交互,現(xiàn)實中,為了獲取更好的性能JVM可能會對指令進行重排序,多線程下可能會出現(xiàn)一些意想不到的問題。使用volatile則會對禁止語義重排序,當然這也一定程度上降低了代碼執(zhí)行效率
volatile關(guān)鍵字的作用:保證可見性,禁止重排序
如果你的代碼在多線程下執(zhí)行和在單線程下執(zhí)行永遠都能獲得一樣的結(jié)果,那么你的代碼就是線程安全的。
lang,util,net,sql,io,concurrent,text
fail-fast機制,它是Java集合的一種錯誤檢測機制。當多個線程對集合進行結(jié)構(gòu)上的改變的操作時,有可能會產(chǎn)生fail-fast機制。記住是有可能,而不是一定。
方案一:在遍歷過程中所有涉及到改變modCount值得地方全部加上synchronized或者直接使用Collections.synchronizedList,這樣就可以解決。但是不推薦,因為增刪造成的同步鎖可能會阻塞遍歷操作。
方案二:使用CopyOnWriteArrayList來替換ArrayList。推薦使用該方案
9、一個線程如果出現(xiàn)了運行時異常會怎么樣
如果這個異常沒有被捕獲的話,這個線程就停止執(zhí)行了。另外重要的一點是:如果這個線程持有某個某個對象的監(jiān)視器,那么這個對象監(jiān)視器會被立即釋放
阻塞隊列BlockingQueue就是為線程之間共享數(shù)據(jù)而設(shè)計的
11、sleep方法和wait方法有什么區(qū)別
這個問題常問,sleep方法和wait方法都可以用來放棄CPU一定的時間,不同點在于如果線程持有某個對象的監(jiān)視器,sleep方法不會放棄這個對象的監(jiān)視器,wait方法會放棄這個對象的監(jiān)視器
13、ThreadLocal有什么用
簡單說ThreadLocal就是一種以空間換時間的做法,在每個Thread里面維護了一個以開地址法實現(xiàn)的ThreadLocal.ThreadLocalMap,把數(shù)據(jù)進行隔離,數(shù)據(jù)不共享,自然就沒有線程安全方面的問題了
區(qū)塊鏈(Blockchain)是比特幣的一個重要概念,本質(zhì)上是一個去中心化的數(shù)據(jù)庫,同時作為比特幣的底層技術(shù)。區(qū)塊鏈是一串使用密碼學(xué)方法相關(guān)聯(lián)產(chǎn)生的數(shù)據(jù)塊,每一個數(shù)據(jù)塊中包含了一次比特幣網(wǎng)絡(luò)交易的信息,用于驗證其信息的有效性(防偽)和生成下一個區(qū)塊。
區(qū)塊鏈在網(wǎng)絡(luò)上是公開的,可以在每一個離線比特幣錢包數(shù)據(jù)中查詢。比特幣錢包的功能依賴于與區(qū)塊鏈的確認,一次有效檢驗稱為一次確認。通常一次交易要獲得數(shù)個確認才能進行。輕量級比特幣錢包使用在線確認,即不會下載區(qū)塊鏈數(shù)據(jù)到設(shè)備存儲中。
區(qū)塊鏈就是把加密數(shù)據(jù)(區(qū)塊)按照時間順序進行疊加(鏈)生成的永久、不可逆向修改的記錄。
在分布式系統(tǒng)中,同時滿足“CAP定律”中的“一致性”、“可用性”和“分區(qū)容錯性”三者是不可能的
提到分布式系統(tǒng),必然要提到分布式事務(wù)。要想理解分布式事務(wù),不得不先介紹一下兩階段提交協(xié)議。
著名的CAP理論:一致性,可用性,分區(qū)容忍性,你可以要其中的兩個。
分布式事務(wù),常見的兩個處理辦法就是兩段式提交和補償。
兩段式提交典型的就是XA,有個事務(wù)協(xié)調(diào)器,告訴大家,來都準備好提交,大家回復(fù),都準備好了,然后協(xié)調(diào)器告訴大家,一起提交,大家都提交了。
補償比較好理解,先處理業(yè)務(wù),然后定時或者回調(diào)里,檢查狀態(tài)是不是一致的,如果不一致采用某個策略,強制狀態(tài)到某個結(jié)束狀態(tài)(一般是失敗狀態(tài)),然后就世界太平了。典型的就是沖正操作。
kimmking:淘寶之類的網(wǎng)站一般的做法是,如果4個都成功才算成功,那么這次提交時4個寫都設(shè)置成一個中間狀態(tài),先容許不一致。然后4個執(zhí)行完成了以后,回調(diào)或是定時任務(wù)里檢查這4個數(shù)據(jù)是不是一致的,如果一致就全部置為成功狀態(tài),如果不一致就全部置為失敗。
聯(lián)機事務(wù)處理OLTP(on-line transaction processing)主要是執(zhí)行基本的、日常的事務(wù)處理,比如數(shù)據(jù)庫記錄的增、刪、改、查。比如在銀行存取一筆款,就是一個事務(wù)交易。
關(guān)系型數(shù)據(jù)庫通常具有ACID特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。
支付寶開發(fā)的分布式事務(wù)是基于兩階段提交的理論(Two Phase Commit)
Phase 1:TM向所有的RM發(fā)送準備請求,RM收到準備請求后,進行準備操作,并向TM回復(fù)是否可以提交。
Phase 2:TM收到所有RM的回復(fù)后,如果所有RM均可以提交,向所有RM發(fā)送提交請求,否則發(fā)送回滾請求。RM根據(jù)TM發(fā)送的消息控制本地事務(wù)提交或回滾。
catch中有return,finally中沒有return,return的值在執(zhí)行finally之前已經(jīng)確定下來了。
悲觀鎖,就是總覺得有刁民想害朕,每次訪問數(shù)據(jù)的時候都覺得會有別人修改它,所以每次拿數(shù)據(jù)時都會上鎖,確保在自己使用的過程中不會被他人訪問。樂觀鎖就是很單純,心態(tài)好,所以每次拿數(shù)據(jù)的時候都不會上鎖,只是在更新數(shù)據(jù)的時候去判斷該數(shù)據(jù)是否被別人修改過。
大多數(shù)的關(guān)系數(shù)據(jù)庫寫入操作都是基于悲觀鎖,缺點在于如果持有鎖的客戶端運行的很慢,那么等待解鎖的客戶端被阻塞的時間就越長。Redis的事務(wù)是基于樂觀鎖的機制,不會在執(zhí)行WATCH命令時對數(shù)據(jù)進行加鎖,只是會在數(shù)據(jù)已經(jīng)被其他客戶端搶先修改了的情況下,通知執(zhí)行WATCH命令的客戶端。樂觀鎖適用于讀多寫少的情況,因為在寫操作比較頻繁的時候,會不斷地retry,從而降低性能。
一般來說,單例模式有五種寫法:懶漢、餓漢、雙重檢驗鎖、靜態(tài)內(nèi)部類、枚舉。上述所說都是線程安全的實現(xiàn)
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日志用于記錄所有更新了數(shù)據(jù)或者已經(jīng)潛在更新了數(shù)據(jù)(例如,沒有匹配任何行的一個DELETE)的所有語句。語句以“事件”的形式保存,它描述數(shù)據(jù)更改。
因為有了數(shù)據(jù)更新的binlog,所以可以用于實時備份,與master/slave復(fù)制
ElasticSearch是一個基于Lucene的搜索服務(wù)器。它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java開發(fā)的,并作為Apache許可條款下的開放源碼發(fā)布,是當前流行的企業(yè)級搜索引擎。設(shè)計用于云計算中,能夠達到實時搜索,穩(wěn)定,可靠,快速,安裝使用方便。
=======================
JVM,JMM,GC,反射,內(nèi)存相關(guān)
多線程,NIO
數(shù)據(jù)結(jié)構(gòu)與算法
數(shù)據(jù)庫相關(guān)
框架相關(guān),分布式事務(wù)
當下熱點