原创 談談final、finally、 finalize有什麼不同

一、final:適合用來在語義方面標識當前的方法、變量、類不可以更改,適合封裝一些代碼,讓用的人知道這些不要隨意更改。final標識的變量不等於不可變,對於變量而言這個變量只是不能夠在賦值,但是可以做任何增刪改查操作。所以從這方面來講,

原创 強引用、軟引用、弱引用、幻象引用有什麼區別

在Java語言中,除了基本數據類型外,其他的都是指向各類對象的對象引用;Java中根據其生命週期的長短,將引用分爲4類。 1 強引用 特點:我們平常典型編碼Object obj = new Object()中的obj就是強引用。通過關鍵字

原创 強軟弱虛引用區別

1 強引用 特點:我們平常典型編碼Object obj = new Object()中的obj就是強引用。通過關鍵字new創建的對象所關聯的引用就是強引用。 當JVM內存空間不足,JVM寧願拋出OutOfMemoryError運行時錯誤(

原创 Elasticsearch實戰之深入功能(二)

使用curl 和 REST API, 發送JSON文檔讓Elasticsearch進行索引。你將看到返回時JSON應答。 如果索引和類型尚不存在,Elasticsearch是如何自動地創建文檔所屬的索引和類型 通過curl命令發送HTT

原创 通過行爲參數化傳遞代碼(下)

目前,當要把新的行爲傳遞給filterApples方法的時候,你不得不聲明好幾個實現ApplePredicate接口的類,然後實例化 好幾個只會提到一次的ApplePredicate對象。下面的程序總結了你目前看到的一切。這真是很囉嗦,

原创 NoClassDefFoundError與ClassNOtFoundException區別

NoClassDefFoundError是一個錯誤(Error),而ClassNOtFoundException是一個異常,在Java中對於錯誤和異常的處理是不同的,我們可以從異常中恢復程序但卻不應該嘗試從錯誤中恢復程序。ClassNot

原创 鎖膨脹過程

如果在嘗試加輕量級鎖的過程中,CAS操作無法成功,這時一種情況就是有其他線程爲此對象加上了輕量級鎖(有競爭),這時候需要進行鎖膨脹,將輕量級鎖變爲重量級鎖。 static Object obj = new Object(); publ

原创 偏向鎖撤銷

撤銷-其他線程使用對象 當有其他線程使用偏向鎖對象時,會將偏向鎖升級爲輕量級鎖 private static void test2() throws InterruptedException { Dog d = new Dog(

原创 偏向鎖狀態

 一個對象創建時, 如果開啓了偏向鎖(默認開啓),那麼對象創建後,markword值爲0x05即最後3位101,這時它的Thread,epoch,age都爲0 偏向鎖默認是延遲的,不會在程序啓動時立即生效,如果想避免延遲,可以加VM參數

原创 wait notify原理

Owner 線程發現條件不滿足,調用 wait 方法,即可進入 WaitSet 變爲 WAITING 狀態 BLOCKED 和 WAITING 的線程都處於阻塞狀態,不佔用 CPU 時間片 BLOCKED 線程會在 Owner 線程釋放

原创 自旋優化過程注意事項

重量級鎖競爭的時候,還可以使用自旋來進行優化,如果當前線程是自旋成功(即這時候將鎖線程已經退出了同步塊,釋放了鎖),這時當前線程就可以避免阻塞. 在Java6之後自旋鎖是自適應的,比如對象剛剛的一次自旋操作成功過,那麼認爲這次自旋成功的可

原创 輕量級鎖概念以及相關知識點

輕量級鎖使用場景:如果一個對象雖然有多線程訪問,但多線程訪問的時間是錯開的(也就是沒有競爭),那麼可以使用輕量級鎖來優化. 輕量級鎖對使用者是透明的,語法依然是synchronized static final Object obj =

原创 淺析Java 線程池實例代碼

線程池的優點: 1.重用線程池中的線程,減少因對象創建,銷燬所帶來的性能開銷; 2.能有效的控制線程的最大併發數,提高系統資源利用率,同時避免過多的資源競爭,避免堵塞; 3.能夠多線程進行簡單的管理,使線程的使用簡單、高效。 線程池框架E

原创 面試題之JDK8默認垃圾回收器是什麼

java -XX:+PrintCommandLineFlags -version -XX:InitialHeapSize=266390080 -XX:MaxHeapSize=4262241280 -XX:+PrintCommandLi

原创 線程池參數設置冷門知識點

初始化線程池時可以預先創建線程嗎? prestartAllCoreThreads 初始化線程池時是可以預先創建線程的,初始化線程池後,再調用prestartAllCoreThreads()方法,即可預先創建corePoolSize數量的核