區別:jdk1.8中取消了永久代,取而代之的是Metaspace,這個空間不佔用jvm虛擬機的內存,而是佔用物理機的內存;jdk8新增了lambda表達式、訪問局部變數、函數式介面等特性。
jdk1.7與jdk1.8比較
1. jdk1 .7語法上
1) 可以用二進位來表示整數,用0b開頭。
2) Switch語句支援string類型
3) try區塊可以不用finally手動關閉,直接try區塊中就可以關閉
4) Catch多個例外說明: Catch異常類型為final所以不能被修改。這項特性將產生更少的字節碼並減少程式碼冗餘。重新拋異常時保持異常類型。
5) 可在數字中使用底線,更友善。但要注意底線添加規則,底線只能在數字之間,在數字的開始或結束一定不能使用下劃線。
6) 建立泛型實例時,會根據變數宣告時的泛型型別自動推斷出實例的泛型類型。
7) 在可變參數方法中傳遞非特定化參數,改善編譯警告和錯誤。
8) 資訊更豐富的回溯追蹤。
2. NIO2的一些新功能
1) 實現了非同步非阻塞IO和Proactor
2) 遞歸查找檔案樹,檔案擴充搜尋
3. Jdbc
1) 可以使用try-with-resources自動關閉Connection, ResultSet,和Statement資源物件。
2) RowSet1.1(介面模型):引入RowSetFactory介面和RowSetProvider類,可以建立JDBC driver支援的各種row sets,這裡的rowset實作其實就是將sql語句上的一些動作轉為方法的操作,封裝了一些功能。
3) JDBC-ODBC驅動程式會在jdk8中刪除。
4. 並發工具增強
1) fork-join,Fork/Join框架是Java7提供了的一個用於平行執行任務的框架, 是一個把大任務分割成若干個小任務,最後匯總每個小任務結果後得到大任務結果的框架。 (充分利用多核心特性,將大問題分解成各個子問題,由多個cpu可以同時解決多個子問題,最後合併結果)。
2) ThreadLocalRandon並發下隨機數產生類別,確保並發下的隨機數產生的線程安全,實際上是使用threadlocal。
3) phaser類別
java5有一個並發套件。裡面有semaphore(訊號量)、CountDownLatch(閉鎖)、CyclicBarrier(柵欄)。 phaser 類別優化了CountDownLatch和CyclicBarrier。
信號量:信號量就是可以宣告多把鎖(包含一把鎖:此時為互斥信號量)。
舉個例子:一個房間如果只能容納5個人,多出來的人必須在門外等著。如何去做呢?一個解決方法就是:房間外面掛著五把鑰匙,每進去一個人就拿走一把鑰匙,沒有鑰匙的不能進入該房間而是在外面等待。每出來一個人就把鑰匙放回原處以方便別人再次進入。
主要用來控制能夠存取的最大執行緒數。預設是非公平的。可以透過構造器顯示聲明鎖的公平性。
閉鎖:
意義:CountDownLatch可以理解為一個計數器在初始化時設定初始值,當一個執行緒需要等待某些操作先完成時,需要呼叫await()方法。這個方法讓執行緒進入休眠狀態直到等待的所有執行緒都執行完成。每呼叫一次countDown()方法內部計數器減1,直到計數器為0時喚醒。這可以理解為特殊的CyclicBarrier。執行緒同步點比較特殊,為內部計數器值為0時開始。
方法:核心方法兩個:countDown()和await()。 countDown():使CountDownLatch維護的內部計數器減1,每個被等待的執行緒完成的時候呼叫。
await():執行緒在執行到CountDownLatch的時候會將此執行緒置於休眠
範例:開會的範例:會議室裡等與會人員到齊了會議才能開始。
柵欄:
意義:柵欄允許兩個或多個執行緒在某個集合點同步。當一個執行緒到達集合點時,它將呼叫await()方法等待其它的執行緒。在執行緒呼叫await()方法後,CyclicBarrier會阻塞這個執行緒並將它置入休眠狀態等待其它執行緒的到來。等最後一個執行緒呼叫await()方法時,CyclicBarrier將喚醒所有等待的執行緒然後這些執行緒將繼續執行。 CyclicBarrier可以傳入另一個Runnable物件作為初始化參數。當所有的執行緒都到達集合點後,CyclicBarrier類別將Runnable物件當作執行緒執行。
方法:await():使執行緒置入休眠直到最後一個執行緒的到來之後喚醒所有休眠的執行緒。
與CountDownLatch的差異:
在所有執行緒到達集合點後接受一個Runnable類型的物件作為後續的執行
沒有顯示呼叫CountDown()方法
CountDownLatch一般只能使用一次,CyclicBarrier可以多次使用
應用場景:多個執行緒做任務,等到達集合點同步後交給後面的執行緒做總表。
Phaser:
意義:更複雜、更強大的同步輔助類別。它允許並發執行多階段任務。當我們有並發任務並且需要分解成幾步執行時,(CyclicBarrier是分成兩個步驟),就可以選擇使用Phaser。 Phaser類別機制是在每一步結束的位置對執行緒進行同步,當所有的執行緒都完成了這一步,才允許下一步。跟其他同步工具一樣,必須對Phaser類別中參與同步操作的任務數進行初始化,不同的是,可以動態的增加或減少任務數。
函數:arriveAndAwaitAdvance():類似CyclicBarrier的await()方法,等待其它執行緒都到來之後同步繼續執行。 arriveAndDeregister():把執行到此的執行緒從Phaser中註銷掉。 isTerminated():判斷Phaser是否終止。 register():將一個新的參與者註冊到Phaser中,這個新的參與者將被當成沒有執行完本階段的線程。 forceTermination():強制Phaser進入終止態
範例:使用Phaser類別同步三個並發任務。這三個任務將在三個不同的資料夾及其子資料夾中查找過去24小時內修改過擴展為.log的檔案。這個任務分成以下三個步驟:找出文件、過濾文件、列印結果。並且在查找文件和過濾文件結束後對結果進行分析,如果是空的,請將此執行緒從Phaser中註銷掉。也就是說,下一階段,該執行緒將不參與運行。在run()方法中,開頭呼叫了phaser的arriveAndAwaitAdvance()方法來確保所有執行緒都啟動了之後再開始查找檔案。在查找文件和過濾文件階段結束之後,都對結果進行了處理。即:如果結果是空的,那麼就把該條執行緒移除,如果不空,那麼等待該階段所有執行緒都執行完該步驟之後在統一執行下一步。最後,任務執行完後,把Phaser中的執行緒都註銷掉。
Phaser其實有兩個狀態:活躍態和終止態。當存在參與同步的線程時,Phaser就是活躍的。並且在每個階段結束的時候同步。當所有參與同步的執行緒都取消註冊的時候,Phase就處於終止狀態。在這種狀態下,Phaser沒有任務參與者。
Phaser主要功能就是執行多階段任務,並確保每個階段點的執行緒同步。在每個階段點還可以條件或移除參與者。主要涉及方法arriveAndAwaitAdvance()和register()和arriveAndDeregister()。
4) Networking增強
新增URLClassLoader close方法,可以及時關閉資源,後續重新載入class檔案時不會導致資源被佔用或無法釋放問題。
5) MultithreadedCustom Class Loaders
解決並發下載入class可能導致的死鎖問題,這個是jdk1.6的一些新版本就解決了,jdk7也做了一些優化。
Java1.8
1. 介面的預設方法
Java1.8以前,介面裡的方法要求全部都是抽象方法,java 8允許我們為介面添加一個非抽象的方法實現,只需要使用default關鍵字即可。
2. lambda表達式
它會讓我們將行為傳送到函數裡。在Java 8之前,如果想將行為傳入函數,僅有的選擇就是匿名類,需要6行程式碼。而定義行為最重要的那行程式碼,卻混在中間不夠突出。 Lambda表達式取代了匿名類,取消了模板,允許用函數式風格編寫程式碼。這樣有時可讀性更好,表達更清晰。
3. 函數式介面
如果一個介面定義個唯一一個抽象方法,那麼這個介面就成為函數式介面。一個函數式介面非常有價值的屬性就是他們能夠用lambdas來實例化。
4. 方法與建構子參考
使用關鍵字來傳遞方法或建構函數參考。
5. Lambda作用域
在lambda表達式中存取外層作用域和舊版的匿名物件中的方式很相似。你可以直接存取標記了final的外層局部變量,或是實例的欄位以及靜態變數。
6. 存取局部變數
可以直接在lambda表達式中存取外層的局部變數。
7. 存取物件欄位與靜態變數
和本地變數不同的是,lambda內部對於實例的欄位以及靜態變數是即可讀取又可寫入。該行為和匿名對像是一致的。
8. 存取介面的預設方法
JDK1.8 API包含了許多內建的函數式接口,在老Java中常用到的例如Comparator或Runnable接口,這些接口都增加了註解以便能用在lambda上。
Java 8API也提供了許多全新的函數式介面來讓工作更加方便,有一些介面是來自Google Guava庫裡的,即便你對這些很熟悉了,還是有必要看看這些是如何擴展到lambda上使用的。
想要查閱更多相關文章,請造訪PHP中文網! !
以上是jdk1.7和jdk1.8的差別是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!