1. Java有什麼新特性
- Java語言
- 編譯器
- 類庫
- 工具
- Java運行時
1. 1 Java語言
- Lambda表達式(閉包)允許把函數作爲一個方法的參數,或者把代碼看成數據。
Arrays.asList("a","b","d").forEach(e->System.out.println(e));
Arrays.asList( "a", "b", "d" ).forEach( e -> {
System.out.print( e );
System.out.print( e );
} );
Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> e1.compareTo( e2 ) );
- 增加函數式接口,可以被隱式轉換爲lambda表達式@FunctionInterface,默認方法與靜態方法並不影響函數式接口的契約。
- 接口的默認方法與靜態方法,所有實現者將會默認繼承它(如果有必要的話,可以覆蓋這個默認實現)
- 方法引用:構造器引用Class::new(無參),靜態方法引用Class::static_method,特定類的任意對象Class::method,特定對象instance::method
- 重複註解
1. 2 Java編譯器的新特性
- 參數名字,方便獲取參數名字
1. 3 Java類庫的新特性
- Optional 一個容器,可以保存類型T的值,或者僅僅保存null,提供有用的方法,這樣我們就不用顯示進行空值檢。如果Optional類的實例爲非空值的話,isPresent()返回true,否則返回false,爲了防止Optional爲空值,orElseGet()方法通過回調函數來產生一個默認值。map()函數對當前Optional的值進行轉換,然後返回一個新的Optional實例。
- Stream 真正的函數式變成風格引入到Java中,極大簡化了集合框架的處理。
- Date/Time API Clock類,指定時區,獲得當前時刻,日期,時間
- parrellelSort()方法,在多核機器上極大提高數組排序速度。
Optional< String > fullName = Optional.ofNullable( null );
System.out.println( "Full Name is set? " + fullName.isPresent() );
System.out.println( "Full Name: " + fullName.orElseGet( () -> "[none]" ) );
System.out.println( fullName.map( s -> "Hey " + s + "!" ).orElse( "Hey Stranger!" ) );
2. synchronized如何實現
- 對象頭 Mark
- 偏向鎖
- 輕量級鎖
- 自旋鎖
- 鎖的升級過程
- synchronized用法:
- synchronized的缺陷:
- 形象的比喻
打個比方:一個object就像一個大房子,大門永遠打開。房子裏有 很多房間(也就是方法)。
這些房間有上鎖的(synchronized方法), 和不上鎖之分(普通方法)。房門口放着一把鑰匙(key),這把鑰匙可以打開所有上鎖的房間。
另外我把所有想調用該對象方法的線程比喻成想進入這房子某個 房間的人。所有的東西就這麼多了,下面我們看看這些東西之間如何作用的。
在此我們先來明確一下我們的前提條件。該對象至少有一個synchronized方法,否則這個key還有啥意義。當然也就不會有我們的這個主題了。
一個人想進入某間上了鎖的房間,他來到房子門口,看見鑰匙在那兒(說明暫時還沒有其他人要使用上鎖的 房間)。於是他走上去拿到了鑰匙,並且按照自己 的計劃使用那些房間。注意一點,他每次使用完一次上鎖的房間後會馬上把鑰匙還回去。即使他要連續使用兩間上鎖的房間,中間他也要把鑰匙還回去,再取回來。
因此,普通情況下鑰匙的使用原則是:“隨用隨借,用完即還。”
這時其他人可以不受限制的使用那些不上鎖的房間,一個人用一間可以,兩個人用一間也可以,沒限制。但是如果當某個人想要進入上鎖的房間,他就要跑到大門口去看看了。有鑰匙當然拿了就走,沒有的話,就只能等了。
要是很多人在等這把鑰匙,等鑰匙還回來以後,誰會優先得到鑰匙?Not guaranteed。象前面例子裏那個想連續使用兩個上鎖房間的傢伙,他中間還鑰匙的時候如果還有其他人在等鑰匙,那麼沒有任何保證這傢伙能再次拿到。
再來看看同步代碼塊。和同步方法有小小的不同。
1.從尺寸上講,同步代碼塊比同步方法小。你可以把同步代碼塊看成是沒上鎖房間裏的一塊用帶鎖的屏風隔開的空間。
2.同步代碼塊還可以人爲的指定獲得某個其它對象的key。就像是指定用哪一把鑰匙才能開這個屏風的鎖,你可以用本房的鑰匙;你也可以指定用另一個房子的鑰匙才能開,這樣的話,你要跑到另一棟房子那兒把那個鑰匙拿來,並用那個房子的鑰匙來打開這個房子的帶鎖的屏風。
記住你獲得的那另一棟房子的鑰匙,並不影響其他人進入那棟房子沒有鎖的房間。
爲什麼要使用同步代碼塊呢?我想應該是這樣的:首先對程序來講同步的部分很影響運行效率,而一個方法通常是先創建一些局部變量,再對這些變量做一些 操作,如運算,顯示等等;而同步所覆蓋的代碼越多,對效率的影響就越嚴重。因此我們通常儘量縮小其影響範圍。
3. 事務介紹
http://blog.csdn.net/zhanghaor/article/details/570843504. Redis與關係型數據庫的同步問題
也就是說:我們會先去redis中判斷數據是否存在,如果存在,則直接返回緩存好的數據。而如果不存在的話,就會去數據庫中,讀取數據,並把數據緩存到Redis中。適用場合:如果數據量比較大,但不是經常更新的情況(比如用戶排行)
而第二種Redis的使用,跟第一種的情況完成不同,具體的情況請看:5. 數據庫索引
在數據之外,數據庫系統還維護着滿足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據,這樣就可以在這些數據結構上實現高級查找算法。這種數據結構,就是索引。一是增加了數據庫的存儲空間,二是在插入和修改數據時要花費較多的時間(因爲索引也要隨之變動)。
上圖展示了一種可能的索引方式。左邊是數據表,一共有兩列七條記錄,最左邊的是數據記錄的物理地址(注意邏輯上相鄰的記錄在磁盤上也並不是一定物理相鄰的)。爲了加快Col2的查找,可以維護一個右邊所示的二叉查找樹,每個節點分別包含索引鍵值和一個指向對應數據記錄物理地址的指針,這樣就可以運用二叉查找在O(log2n)的複雜度內獲取到相應數據。
創建索引可以大大提高系統的性能。
第一,通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性。
第二,可以大大加快數據的檢索速度,這也是創建索引的最主要的原因。
第三,可以加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。
第四,在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。
第五,通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。
也許會有人要問:增加索引有如此多的優點,爲什麼不對錶中的每一個列創建一個索引呢?因爲,增加索引也有許多不利的方面。
第一,創建索引和維護索引要耗費時間,這種時間隨着數據量的增加而增加。
第二,索引需要佔物理空間,除了數據表佔數據空間之外,每一個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。
第三,當對錶中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。
一般說來,應該在這些列上建立索引:
在經常需要搜索的列上,可以加快搜索的速度,
在作爲主鍵的列上,強制該列的唯一性和組織表中的排列結構
在經常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度
在需要根據範圍進行搜索的列上創建索引,因爲索引已經排序,其指定的範圍是連續的
在經常需要排序的列上創建索引,因爲索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢的時間
在經常使用where子句中的列上面創建索引,加快條件的判斷速度。