中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

Java: 未來已來

2018-10-31    來源:importnew

容器云強(qiáng)勢上線!快速搭建集群,上萬Linux鏡像隨意使用

在10月22的 Oracle Codeone大會上,Java 平臺的首席架構(gòu)師 Mark Reinhold 做了The Future of Java is Today的演講, 回顧了最近 Java 的幾個(gè)版本的新的功能,Java 的每年兩次的發(fā)布周期, 澄清了關(guān)于發(fā)布流程和 Java 版本的幾個(gè)誤區(qū),最后花了很大的篇幅介紹了未來 Java 幾個(gè)令人非常期待的幾個(gè)孵化中項(xiàng)目,可以為Java帶來更好的生產(chǎn)力、性能和可擴(kuò)展性。我整理了這四個(gè)項(xiàng)目相關(guān)的知識,你可以提前了解到 Java 未來的這些酷炫的特性。

Mark Reinhold 我不多介紹了, 之前要了解Java的未來動向看Java之父James Gosling, 他離開Oracle之后想了解Java的動向就看 Mark Reinhold。

Project Amber

提供面向生產(chǎn)力的 Java 特性, 比如字符串字面值、switch 表達(dá)式、模式匹配、record 等。

這個(gè)項(xiàng)目包含很多Java語言特性的新功能。

包括

正在實(shí)現(xiàn)的

  • JEP 302?Lambda Leftovers:對lambda功能的補(bǔ)強(qiáng), 比如下劃線變量等?BiFunction<Integer, String, String> biss = (i, _) -> String.valueOf(i);?lambda參數(shù)的Shadowing,消除一些歧義等修補(bǔ)工作
  • JEP 305?Pattern Matching:這個(gè)功能非常好,Scala 和 Kotlin 中的模式匹配非常強(qiáng)大,這個(gè) JEP 提供了類似的功能,配合 switch 和 record,可以大大簡化條件分支的處理,如:
int eval(Node n) {
    switch(n) {
        case IntNode(int i): return i;
        case NegNode(Node n): return -eval(n);
        case AddNode(Node left, Node right): return eval(left) + eval(right);
        case MulNode(Node left, Node right): return eval(left) * eval(right);
        default: throw new IllegalStateException(n);
    };
}

數(shù)據(jù)類,一行定義,省去了字段、字段訪問方法和 hash、equals、toString 等方法,定義 ValueObject 簡化到家了:

record Point(int x, int y);
  • JEP 325?Switch Expressions (preview, JDK 12): 當(dāng)前的switch是什么, 語句。這個(gè)jep擴(kuò)展switch,并且可以作為表達(dá)式使用:
int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    case THURSDAY, SATURDAY     -> 8;
    case WEDNESDAY              -> 9;
};
  • JEP 326?Raw String Literals (preview, JDK 12): 這個(gè)很多語言中都實(shí)現(xiàn)了,可以更好的書寫字符串字面值, 尤其在正則表達(dá)式中處理很多轉(zhuǎn)義符的時(shí)候,和 Go 類似:
String s = `
this is my
    embedded string
`;
  • JEP draft 8209434?Concise Method Bodies: 正常的方法定義以大括號包裹,這個(gè)特性提供了類似 Lambda 表達(dá)式簡化方式的形式,直接單行定義方法體,類似 C# 和 Kotlin 的特性:
class MyList<T> implements List<T> {
    private List<T> aList;
    public int size() = aList::size;
    public T get(int index) = aList::get;
    ...
}

已發(fā)布的

  • JEP 286 Local-Variable Type Inference (var) (JDK 10):本地變量的類型推斷, 也就是使用var定義變量,有些同學(xué)已經(jīng)用起來了,非常的方便,有點(diǎn)類似動態(tài)類型的語言,感覺雖然還沒有達(dá)到Scala那么靈活,已經(jīng)很不錯了
  • JEP 323 Local-Variable Syntax for Lambda Parameters (JDK 11):對本地變量的類型推斷的加強(qiáng),用在 Lambda 表達(dá)式中。

暫時(shí)擱置的

  • JEP 301 Enhanced Enums

總之,每一個(gè)特性都可以大大簡化我們的開發(fā),讓 Java 更像一個(gè)“現(xiàn)代的”編程語言。

Project Loom

提供一個(gè)輕量級的用戶態(tài)的纖程,叫做?fiber,更加簡化并發(fā)編程,而且更有效。

這個(gè)特性多年前我介紹過:?https://colobu.com/2016/08/01/talk-about-quasar-again/,當(dāng)時(shí)它還像一個(gè)玩具,開發(fā)的時(shí)候很麻煩,而且有一些坑。作者后來負(fù)責(zé)這個(gè) JEP,可以很好的從 Java 實(shí)現(xiàn)的角度去實(shí)現(xiàn) fiber,所以很是期待。

Mark Reinhold 首先使用 jshell 演示了 fiber 的使用,一兩行程序就可以做到,我覺得方便性可以和 goroutine 相媲美了。他接著使用一個(gè) Restful 的例子比較了 Thread 和 Fiber 的性能, Restful?服務(wù)收到請求后暫停100毫秒,模擬一個(gè)慢的 IO 操作,結(jié)果顯示 Thread 很多幾百毫秒的尖峰,而 fiber 在預(yù)熱之后一直穩(wěn)定在100毫秒。 這絕對是 Java 程序員值的關(guān)注一個(gè)新特性。

例子使用 Jetty 做服務(wù)器,線程池執(zhí)行命令的時(shí)候讓 fiber 去調(diào)度,這種方式對現(xiàn)有的代碼改動很小。

我比較關(guān)注的是如果它的內(nèi)部調(diào)度算法怎么實(shí)現(xiàn)的,另外,一個(gè)包含復(fù)雜業(yè)務(wù)完成時(shí)間較長的 fiber 是否能被調(diào)度器自動調(diào)度,以便使用有限的線程調(diào)度其它的 fiber, 類似 goroutine 在系統(tǒng)調(diào)用的時(shí)候自動插入檢查點(diǎn)。

Project Panama

提升 JVM 和外部(非 Java)代碼和數(shù)據(jù)聯(lián)系

當(dāng)然,這個(gè)項(xiàng)目不僅僅是簡化JNI的開發(fā),而且提供了很多的特性:

  • native function calling from JVM (C, C++), specifically per JEP 191
  • native data access from JVM or inside JVM heap
  • new data layouts in JVM heap
  • native metadata definition for JVM
  • header file API extraction tools (see below)
  • native library management APIs
  • native-oriented interpreter and runtime “hooks”
  • class and method resolution “hooks”
  • native-oriented JIT optimizations
  • tooling or wrapper interposition for safety
  • exploratory work with difficult-to-integrate native libraries

Mark Reinhold 在演講中舉了兩個(gè)例子,首先是為 POSIX 操作系統(tǒng)? API 的頭文件?unistd.h?中的函數(shù)生成 Java 的可訪問代碼。

jextract?工具會生成一堆的函數(shù)和類型,關(guān)鍵這些是從c的頭文件中自動生成的,你不必費(fèi)勁心思去自己設(shè)計(jì)類型和方法了。這一點(diǎn)比Go語言中的 CGO 要方便多了,快捷度可以和C#互操作性相媲美。

所以,以后你要是想從 Java 中訪問 C 的鏈接庫,可以使用?jextract?一步生成,

調(diào)用方法也很方便。

另一個(gè)例子是調(diào)用 C 標(biāo)準(zhǔn)庫?time.h?中的?clock_gettime?函數(shù),它的參數(shù)需要 struct 類型,使用上面相同的手段可以生成訪問類:

當(dāng)然這兩個(gè)例子只演示了這個(gè)項(xiàng)目的一個(gè)功能,更多的功能我們可以持續(xù)關(guān)注。

Project Valhalla

包含兩個(gè)Feature:值類型和基本類型的泛型。

  • 值類型:提供不可變類型和非引用類型的支持。不可變類型在 Scala 中很常用,Java 中也會引進(jìn)這中類型。使用這種類型有很多好處,一個(gè)就是可以顯著地提高性能,因?yàn)閿?shù)據(jù)不可變,你也不必?fù)?dān)心同步更新的問題。
  • 基本類型的泛型: 為 primitive type 提供泛型的支持,不必再進(jìn)行裝箱開箱操作。

Mark Reinhold 用一個(gè)復(fù)數(shù)矩陣相乘的例子來測試,測試工具使用 JMH。

首先是正常的?public class Complex {...}?類,然后改成值類型?public value class Complex{...}?再次測試,結(jié)果顯示,
正常測試花費(fèi)3.6秒內(nèi)存分配3.7G;值類型則只需要0.3秒花費(fèi)3.8M左右,效果驚人!

目前這些特性還在開發(fā)之中,Mark Reinhold 用 Java12 + 這些項(xiàng)目已經(jīng)能跑一些例子了,我們可以期待不遠(yuǎn)的將來能在 Java 中使用到這些美妙的特性。

標(biāo)簽: 代碼 服務(wù)器

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:Spring Security 5.0的DelegatingPasswordEncoder詳解

下一篇:Git 實(shí)用小命令收集