1、Hadoop、Storm、Spark、Facebook、Twitter、Ali baba都在使用Java高性能NIO通信框架Netty,本書告訴你Why,通過本書你可以、系統地理解Netty 架構設計理念,以及異步NIO 編程。1、Hadoop、Storm、Spark、Facebook、Twitter、Ali baba都在使用Java高性能NIO通信框架Netty,本書告訴你Why,通過本書你可以、系統地理解Netty 架構設計理念,以及異步NIO 編程。
2、本書作者為博學一線專家,在產品中廣泛應用了Netty等NIO框架,具有豐富的多年實踐經驗,這就使得本書內容帶有很強的實踐性,讓你更快速掌握Java高并發異步通信的優先選擇 框架——Netty的用法。
3、本書第1版出版后受到業界的一致好評,應讀者的要求,第2版增加了MessagePack 編解碼、服務端創建、客戶端創建、高性能之道、性、安全性等內容,內容更精彩。
Netty是什么?使用Netty能夠做什么?為什么要從傳統的Socket開發切換到NIO進行編程?為什么不直接基于JDK的NIO類庫編程而選擇Netty?如何系統地掌握Netty進行NettyNIO開發、Netty編解碼開發、Netty多協議開發?如何通過對Netty源碼的學習獲得更深入地知識?掌握了Netty后,如何將其應用到實際架構中?Netty工程師的就業前景和可涉足的行業是怎樣的?本書都會一一解答。
推薦購買:
《云計算網絡珠璣》
李林鋒:Netty中國推廣者,現華為技術有限公司平臺中間件架構與設計部設計師,公司總裁技術創新獎獲得者。長期從事高性能通信軟件的架構設計和開發工作,有多年在NIO領域的設計、開發和運維經驗,精通NIO編程和Netty、Mina等主流NIO框架。目前負責華為軟件公司下一代SOA中間件和PaaS平臺的架構設計工作。
基礎篇走進Java NIO
第1 章Java 的I/O 演進之路.2
1.1 I/O 基礎入門...............3
1.1.1 Linux 網絡I/O 模型簡介.......3
1.1.2 I/O 多路復用技術.................6
1.2 Java 的I/O 演進..........8
1.3 總結............................ 10
第2 章NIO 入門.................... 11
2.1 傳統的BIO 編程....... 11
2.1.1 BIO 通信模型圖.................. 12
2.1.2 同步阻塞式I/O 創建的TimeServer 源碼分析............. 13
2.1.3 同步阻塞式I/O 創建的TimeClient 源碼分析.......... 16
2.2 偽異步I/O 編程........ 18
2.2.1 偽異步I/O 模型圖.............. 19
2.2.2 偽異步I/O 創建的TimeServer 源碼分析..... 19
2.2.3 偽異步I/O 弊端分析........... 21
2.3 NIO 編程.................... 24
2.3.1 NIO 類庫簡介.. 24
2.3.2 NIO 服務端序列圖.............. 28
2.3.3 NIO 創建的TimeServer 源碼分析................ 30
2.3.4 NIO 客戶端序列圖.............. 36
2.3.5 NIO 創建的TimeClient 源碼分析................ 39
2.4 AIO 編程.................... 45
2.4.1 AIO 創建的TimeServer 源碼分析................ 46
2.4.2 AIO 創建的TimeClient 源碼分析................ 51
2.4.3 AIO 版本時間服務器運行結果.................... 56
2.5 4 種I/O 的對比......... 58
2.5.1 概念澄清.......... 58
2.5.2 不同I/O 模型對比.............. 59
2.6 選擇Netty 的理由..... 60
2.6.1 不選擇Java 原生NIO 編程的原因............... 61
2.6.2 為什么選擇Netty ................ 62
2.7 總結............................ 63
入門篇 Netty NIO 開發指南
第3 章Netty 入門應用.......... 66
3.1 Netty 開發環境的搭建................ 66
3.1.1 下載Netty 的軟件包........... 67
3.1.2 搭建Netty 應用工程........... 67
3.2 Netty 服務端開發...... 68
3.3 Netty 客戶端開發...... 73
3.4 運行和調試................ 76
3.4.1 服務端和客戶端的運行...... 76
3.4.2 打包和部署...... 77
3.5 總結............................ 77
第4 章TCP 粘包/拆包問題的解決之道...... 79
4.1 TCP 粘包/拆包.......... 79
4.1.1 TCP 粘包/拆包問題說明..... 80
4.1.2 TCP 粘包/拆包發生的原因....... 80
4.1.3 粘包問題的解決策略.......... 81
4.2 未考慮TCP 粘包導致功能異常案例................. 82
4.2.1 TimeServer 的改造.............. 82
4.2.2 TimeClient 的改造............... 83
4.2.3 運行結果.......... 84
4.3 利用LineBasedFrameDecoder 解決TCP 粘包問題................ 85
4.3.1 支持TCP 粘包的TimeServer ....................... 86
4.3.2 支持TCP 粘包的TimeClient........................ 88
4.3.3 運行支持TCP 粘包的時間服務器程序........ 90
4.3.4 LineBasedFrameDecoder 和StringDecoder 的原理分析........... 91
4.4 總結............................ 92
第5 章分隔符和定長解碼器的應用...... 93
5.1 DelimiterBasedFrameDecoder 應用開發............. 94
5.1.1 DelimiterBasedFrameDecoder 服務端開發.... 94
5.1.2 DelimiterBasedFrameDecoder 客戶端開發.... 97
5.1.3 運行DelimiterBasedFrameDecoder 服務端和客戶端............... 99
5.2 FixedLengthFrameDecoder 應用開發............... 101
5.2.1 FixedLengthFrameDecoder 服務端開發...... 101
5.2.2 利用telnet 命令行測試EchoServer 服務端......103
5.3 總結.......................... 104
中級篇 Netty 編解碼開發指南
第6 章編解碼技術.............. 106
6.1 Java 序列化的缺點 ...... 107
6.1.1 無法跨語言.... 107
6.1.2 序列化后的碼流太大........ 107
6.1.3 序列化性能太低................ 110
6.2 業界主流的編解碼框架............ 113
6.2.1 Google 的Protobuf 介紹.... 113
6.2.2 Facebook 的Thrift 介紹.... 115
6.2.3 JBoss Marshalling 介紹..... 116
6.3 總結.......................... 117
第7 章MessagePack 編解碼............... 118
7.1 MessagePack 介紹... 118
7.1.1 MessagePack 多語言支持.. 119
7.1.2 MessagePack Java API 介紹........................ 119
7.1.3 MessagePack 開發包下載. 120
7.2 MessagePack 編碼器和解碼器開發................. 120
7.2.1 MessagePack 編碼器開發....... 120
7.2.2 MessagePack 解碼器開發 ...... 121
7.2.3 功能測試........ 121
7.3 粘包/半包支持......... 124
7.4 總結.......................... 127
第8 章Google Protobuf 編解碼.......... 128
8.1 Protobuf 的入門....... 129
8.1.1 Protobuf 開發環境搭建..... 129
8.1.2 Protobuf 編解碼開發......... 131
8.1.3 運行Protobuf 例程............ 133
8.2 Netty 的Protobuf 服務端開發.. 133
8.2.1 Protobuf 版本的圖書訂購服務端開發........ 134
8.2.2 Protobuf 版本的圖書訂購客戶端開發........ 136
8.2.3 Protobuf 版本的圖書訂購程序功能測試.... 139
8.3 Protobuf 的使用注意事項......... 140
8.4 總結.......................... 142
第9 章JBoss Marshalling 編解碼....... 143
9.1 Marshalling 開發環境準備........ 143
9.2 Netty 的Marshalling 服務端開發..................... 144
9.3 Netty 的Marshalling 客戶端開發..................... 147
9.4 運行Marshalling 客戶端和服務端例程........... 149
9.5 總結.......................... 150
高級篇 Netty 多協議開發和應用
第10 章HTTP 協議開發應用............... 154
10.1 HTTP 協議介紹..... 155
10.1.1 HTTP 協議的URL .......... 155
10.1.2 HTTP 請求消息(HttpRequest).............. 155
10.1.3 HTTP 響應消息(HttpResponse)........... 158
10.2 Netty HTTP 服務端入門開發....... 159
10.2.1 HTTP 服務端例程場景描述..................... 160
10.2.2 HTTP 服務端開發........... 160
10.2.3 Netty HTTP 文件服務器例程運行結果.... 166
10.3 Netty HTTP XML 協議棧開發....................... 170
10.3.1 開發場景介紹................. 171
10.3.2 HTTP XML 協議棧設計.......174
10.3.3 高效的XML 綁定框架JiBx ..................... 175
10.3.4 HTTP XML 編解碼框架開發.................. 183
10.3.5 HTTP XML 協議棧測試....... 199
10.3.6 小結............. 201
10.4 總結........................ 202
第11 章WebSocket 協議開發............. 203
11.1 HTTP 協議的弊端....... 204
11.2 WebSocket 入門..... 204
11.2.1 WebSocket 背景............... 205
11.2.2 WebSocket 連接建立....... 206
11.2.3 WebSocket 生命周期....... 207
11.2.4 WebSocket 連接關閉....... 208
11.3 Netty WebSocket 協議開發..... 209
11.3.1 WebSocket 服務端功能介紹..................... 209
11.3.2 WebSocket 服務端開發.... 210
11.3.3 運行WebSocket 服務端... 218
11.4 總結........................ 219
第12 章私有協議棧開發.... 221
12.1 私有協議介紹........ 221
12.2 Netty 協議棧功能設計............ 223
12.2.1 網絡拓撲圖.. 223
12.2.2 協議棧功能描述.............. 224
12.2.3 通信模型...... 224
12.2.4 消息定義...... 225
12.2.5 Netty 協議支持的字段類型...................... 226
12.2.6 Netty 協議的編解碼規范. 227
12.2.7 鏈路的建立.. 229
12.2.8 鏈路的關閉.. 230
12.2.9 性設計.. 230
12.2.10 安全性設計 232
12.2.11 可擴展性設計................ 232
12.3 Netty 協議棧開發.. 233
12.3.1 數據結構定義................. 233
12.3.2 消息編解碼.. 237
12.3.3 握手和安全認證.............. 241
12.3.4 心跳檢測機制................. 245
12.3.5 斷連重連...... 248
12.3.6 客戶端代碼.. 249
12.3.7 服務端代碼.. 251
12.4 運行協議棧............ 252
12.4.1 正常場景...... 252
12.4.2 異常場景:服務端宕機重啟.................... 253
12.4.3 異常場景:客戶端宕機重啟.................... 256
12.5 總結........................ 256
第13 章服務端創建............ 258
13.1 原生NIO 類庫的復雜性......... 259
13.2 Netty 服務端創建源碼分析.... 259
13.2.1 Netty 服務端創建時序圖. 260
13.2.2 Netty 服務端創建源碼分析...................... 263
13.3 客戶端接入源碼分析.............. 272
13.4 總結........................ 275
第14 章客戶端創建............ 276
14.1 Netty 客戶端創建流程分析.... 276
14.2.1 Netty 客戶端創建時序圖. 276
14.2.2 Netty 客戶端創建流程分析...................... 277
14.2 Netty 客戶端創建源碼分析.... 278
14.2.1 客戶端連接輔助類Bootstrap.................... 278
14.2.2 客戶端連接操作.............. 281
14.2.3 異步連接結果通知.......... 283
14.2.4 客戶端連接超時機制...... 284
14.3 總結........................ 286
源碼分析篇 Netty 功能介紹和源碼分析
第15 章ByteBuf 和相關輔助類........... 288
15.1 ByteBuf 功能說明. 288
15.1.1 ByteBuf 的工作原理........ 289
15.1.2 ByteBuf 的功能介紹........ 294
15.2 ByteBuf 源碼分析. 308
15.2.1 ByteBuf 的主要類繼承關系..................... 309
15.2.2 AbstractByteBuf 源碼分析........................ 310
15.2.3 AbstractReferenceCountedByteBuf 源碼分析.................. 319
15.2.4 UnpooledHeapByteBuf 源碼分析.............. 321
15.2.5 PooledByteBuf 內存池原理分析............... 326
15.2.6 PooledDirectByteBuf 源碼分析................. 329
15.3 ByteBuf 相關的輔助類功能介紹.................... 332
15.3.1 ByteBufHolder................. 332
15.3.2 ByteBufAllocator ............. 333
15.3.3 CompositeByteBuf ........... 334
15.3.4 ByteBufUtil .. 336
15.4 總結........................ 337
第16 章Channel 和Unsafe ................. 338
16.1 Channel 功能說明. 338
16.1.1 Channel 的工作原理........ 339
16.1.2 Channel 的功能介紹........ 340
16.2 Channel 源碼分析. 343
16.2.1 Channel 的主要繼承關系類圖.................. 343
16.2.2 AbstractChannel 源碼分析........................ 344
16.2.3 AbstractNioChannel 源碼分析.................. 347
16.2.4 AbstractNioByteChannel 源碼分析........... 350
16.2.5 AbstractNioMessageChannel 源碼分析..... 353
16.2.6 AbstractNioMessageServerChannel 源碼分析.............. 354
16.2.7 NioServerSocketChannel 源碼分析........... 355
16.2.8 NioSocketChannel 源碼分析..................... 358
16.3 Unsafe 功能說明... 364
16.4 Unsafe 源碼分析... 365
16.4.1 Unsafe 繼承關系類圖...... 365
16.4.2 AbstractUnsafe 源碼分析. 366
16.4.3 AbstractNioUnsafe 源碼分析.................... 375
16.4.4 NioByteUnsafe 源碼分析. 379
16.5 總結........................ 387
第17 章ChannelPipeline 和ChannelHandler........... 388
17.1 ChannelPipeline 功能說明....... 389
17.1.1 ChannelPipeline 的事件處理.................... 389
17.1.2 自定義攔截器................. 391
17.1.3 構建pipeline 392
17.1.4 ChannelPipeline 的主要特性.................... 393
17.2 ChannelPipeline 源碼分析....... 393
17.2.1 ChannelPipeline 的類繼承關系圖............. 393
17.2.2 ChannelPipeline 對ChannelHandler 的管理........... 393
17.2.3 ChannelPipeline 的inbound 事件.............. 396
17.2.4 ChannelPipeline 的outbound 事件............ 397
17.3 ChannelHandler 功能說明....... 398
17.3.1 ChannelHandlerAdapter 功能說明............ 399
17.3.2 ByteToMessageDecoder 功能說明............ 399
17.3.3 MessageToMessageDecoder 功能說明...... 400
17.3.4 LengthFieldBasedFrameDecoder 功能說明............... 400
17.3.5 MessageToByteEncoder 功能說明............. 404
17.3.6 MessageToMess
13.2.1Netty服務端創建時序圖
下面我們對Netty服務端創建的關鍵步驟和原理進行講解。
步驟1:創建ServerBootstrap實例。ServerBootstrap是Netty服務端的啟動輔助類,它提供了一系列的方法用于設置服務端啟動相關的參數。底層通過門面模式對各種能力進行抽象和封裝,盡量不需要用戶跟過多的底層API打交道,降低用戶的開發難度。
我們在創建ServerBootstrap實例時,會驚訝地發現ServerBootstrap只有一個無參的構造函數,作為啟動輔助類這讓人不可思議,因為它需要與多個其他組件或者類交互。ServerBootstrap構造函數沒有參數的根本原因是因為它的參數太多了,而且未來也可能會發生變化,為了解決這個問題,就需要引入Builder模式。《Effective Java》第二版第2條建議遇到多個構造器參數時要考慮用構建器,關于多個參數構造函數的缺點和使用構建器的優點大家可以查閱《Effective Java》,在此不再詳述。
步驟2:設置并綁定Reactor線程池。Netty的Reactor線程池是EventLoopGroup,它實際就是EventLoop的數組。EventLoop的職責是處理所有注冊到本線程多路復用器Selector上的Channel,Selector的輪詢操作由綁定的EventLoop線程run方法驅動,在一個循環體內循環執行。值得說明的是,EventLoop的職責不僅僅是處理網絡I/O事件,用戶自定義的Task和定時任務Task也統一由EventLoop負責處理,這樣線程模型就實現了統一。從調度層面看,也不存在在EventLoop線程中再啟動其他類型的線程用于異步執行另外的任務,這樣就避免了多線程并發操作和鎖競爭,提升了I/O線程的處理和調度性能。
步驟3:設置并綁定服務端Channel。作為NIO服務端,需要創建ServerSocketChannel,Netty對原生的NIO類庫進行了封裝,對應實現是NioServerSocketChannel。對于用戶而言,不需要關心服務端Channel的底層實現細節和工作原理,只需要指定具體使用哪種服務端Channel即可。因此,Netty的ServerBootstrap方法提供了channel方法用于指定服務端Channel的類型。Netty通過工廠類,利用反射創建NioServerSocketChannel對象。由于服務端監聽端口往往只需要在系統啟動時才會調用,因此反射對性能的影響并不大。相關代碼如下。
public ServerBootstrap channel(Class channelClass) {
if (channelClass == null) {
throw new NullPointerException("channelClass");
}
return channelFactory(new ServerBootstrapChannelFactory(channelClass));
}
步驟4:鏈路建立的時候創建并初始化ChannelPipeline。ChannelPipeline并不是NIO服務端必需的,它本質就是一個負責處理網絡事件的職責鏈,負責管理和執行ChannelHandler。網絡事件以事件流的形式在ChannelPipeline中流轉,由ChannelPipeline根據ChannelHandler的執行策略調度ChannelHandler的執行。典型的網絡事件如下。
(1)鏈路注冊;
(2)鏈路激活;
(3)鏈路斷開;
(4)接收到請求消息;
(5)請求消息接收并處理完畢;
(6)發送應答消息;
(7)鏈路發生異常;
(8)發生用戶自定義事件。
步驟5:初始化ChannelPipeline完成之后,添加并設置ChannelHandler。ChannelHandler是Netty提供給用戶定制和擴展的關鍵接口。利用ChannelHandler用戶可以完成大多數的功能定制,例如消息編解碼、心跳、安全認證、TSL/SSL認證、流量控制和流量整形等。Netty同時也提供了大量的系統ChannelHandler供用戶使用,比較實用的系統ChannelHandler總結如下。
(1)系統編解碼框架——ByteToMessageCodec;
(2)通用基于長度的半包解碼器——LengthFieldBasedFrameDecoder;
(3)碼流日志打印Handler——LoggingHandler;
(4)SSL安全認證Handler——SslHandler;
(5)鏈路空閑檢測Handler——IdleStateHandler;
(6)流量整形Handler——ChannelTrafficShapingHandler;
(7)Base64編解碼——Base64Decoder和Base64Encoder。
創建和添加ChannelHandler的代碼示例如下。
.childHandler(new ChannelInitializer() {
@Override
public void initChannel(SocketChannel ch
throws Exception {
ch.pipeline().addLast
new EchoServerHandler());
}
});
步驟6:綁定并啟動監聽端口。在綁定監聽端口之前系統會做一系列的初始化和檢測工作,完成之后,會啟動監聽端口,并將ServerSocketChannel注冊到Selector上監聽客戶端連接,相關代碼如下。
protected void doBind(SocketAddress localAddress) throws Exception {
javaChannel().socket().bind(localAddress, config.getBacklog());
}
步驟7:Selector輪詢。由Reactor線程NioEventLoop負責調度和執行Selector輪詢操作,選擇準備就緒的Channel集合,相關代碼如下。
private void select() throws IOException {
Selector selector = this.selector;
try {
//此處代碼省略......
int selectedKeys = selector.select(timeoutMillis);
selectCnt ;
//此處代碼省略......
}
步驟8:當輪詢到準備就緒的Channel之后,就由Reactor線程NioEventLoop執行ChannelPipeline的相應方法,最終調度并執行ChannelHandler,接口如圖13-2所示。
步驟9:執行Netty系統ChannelHandler和用戶添加定制的ChannelHandler。ChannelPipeline根據網絡事件的類型,調度并執行ChannelHandler,相關代碼如下。
public ChannelHandlerContext fireChannelRead(Object msg) {
DefaultChannelHandlerContext next = findContextInbound(MASK_CHANNEL_READ);
next.invoker.invokeChannelRead(next, msg);
return this;
}
林鋒讓我給這本新書寫個推薦,不勝榮幸。我和林鋒接觸時間不長,已經感受到了他對技術的熱愛和不盡探索。這種熱愛來自于內心的驅動,不摻雜任何雜質,我認為他是我見到的為數不多的技術熱愛者。也正是因為這種熱愛,促使林鋒花費了很多業余時間,完成了這樣一本對Netty的編程指南。相信讀者在閱讀此書時,在感嘆內容之豐富詳實的同時,也會深深感受到林鋒對所著技術的熱愛。我想這就是我們通過書中文字相遇的初衷吧。當我們的技術能夠日益精進,達到專業的水準,生產力會成倍甚至指數級地增長。希望讀者能夠通過閱讀此書獲取這種精進的力量。
——IBM中國開發實驗室開發總監 黃省江
Netty的之處在于它是一個高性能、異步事件驅動的NIO框架,目前很多著名的開源框架開始將底層的通信框架切換到Netty,如Hadoop、Storm等,Facebook的后臺也即將啟用這一框架。希望這本書的面市能夠對Netty在國內的發展起到推動作用。
——Facebook博學工程師 覃超
中國的閱讀類應用——中國移動手機閱讀基地,每天承受著5~7.5億PV的訪問量,為了實現業務的彈性,華為Digital SDP產品承接了對其后臺進行微服務重構的工作,一個PV背后的后臺原子接口訪問達到幾十乃至上百次,還要保障90%的頁面訪問在500ms內響應,在這樣的壓力下,高效的通信機制尤其重要,林鋒基于Netty構建的對等通信虛擬總線很好地承載了這一需求。平均通信時延0.71ms,80%以上的通信時延都保持在1ms以下,其余通信時延都低于3ms,在響應速度這一重要指標上不僅滿足了客戶的要求,而且還帶來了系統可伸縮性和彈性上的巨大提升,林鋒在本書中闡釋的Netty應用上的經驗和技巧值得期待。
——華為Digital SDP首席架構師 王慷
最近幾年,Netty社區的發展如火如荼,無論是大數據領域的演進,還是微服務架構的流行,都需要高效的分布式通信機制作為基本支撐,Netty憑借優異的性能、靈活的擴展性得到了廣泛的應用。林鋒兄曾將自己在NIO領域的積累以博文的形式共享,得到了Java社區的熱烈響應,他對NIO領域的積累和見解令人敬佩。本次升級更新后的第2版,相信會有更多新鮮和實用的知識增加進來,毫無疑問,它會成為學習高性能NIO的必備圖書。
——IT圖書譯者、InfoQ編輯 張衛濱
設計開發基于異步編程模型的高性能服務器,除了理解和熟練應用NIO等這些Java層面的基礎知識之外,能夠駕馭的異步通信框架也是非常重要的,Netty無疑是Java領域最值得學習和研究的異步事件驅動的NIO框架。作者有著多年的NIO開發和運維經驗,本書濃縮了作者多年實戰經驗,推薦給對Netty技術感興趣、想研究的攻城獅閱讀!
——螞蟻金服基礎技術部JVM Architect 李三紅
Netty是一個令人驚訝的項目,在短短幾年內成為眾多Java高并發異步通信的框架。但目前國內資料極少并缺乏系統性,而李兄的這本系統介紹Netty開發和原理的書籍,很地填補了這個空白。國內的技術人員對Java NIO和Netty的理解多一些,也就意味著國內整體網絡編程技術的進步。本書條理清晰,對技術的闡述循序漸進,是一本難得的Netty學習教材,推薦有志青年仔細學習研究本書,共同把NIO異步通信編程推向一個新高度。
——JBoss應用服務器核心開發組成員 張建鋒
寫的非常好,比較有深度,感覺比netty in action 要好,要神
真的不錯啊
萬象快遞,當當自營
當當不是以前的當當了
價格相當實惠
也是值得研究的一本書
介紹的很詳細,很有幫助
有折很,包裝也很一般
感覺書中有很多瑕疵,不夠嚴謹,部分代碼好像還有缺陷。基礎不好的建議不要買,因為有的代碼會卡你半天,因為根本編譯通不過。
書沒什么問題,就是快遞員打電話說包裹不小心開了個口子,我認為是沒問題就行也沒在意,結果拿到快遞的時候發現開口很齊整小核最重要的是發票沒有了,不知道是快遞員拿走了還是根本沒發
非常的不錯
印刷很好,字跡清晰,是正版,輸的內容講解很完美
很好,非常不錯!很好,非常不錯!
很好,非常不錯!很好,非常不錯!
還沒有看,看完再評論
不錯 正品 值得買
品質不錯 可讀性強
能夠深入了解,底層原理
拿到了,還沒有開始看,用到了再回來追加
部分內容有些過時,但總體不錯
還沒看,想深入了解NIO的話,就看看這本
很詳細,NIO必讀
好書,好內容。在大數據時代尤其對我有幫助
看了第一章,及大綱。真的是本不錯的書!
其他都不錯,唯一不爽就是沒有紙箱包裝,書很容易弄皺。。
非常好,我喜歡這種看不懂,但是可以放在電腦旁裝逼的書。
拿到書的時候書就沒有塑料封皮,紙質還行,印刷也還不錯
非常好的一本書,實用,java并發編程的神器!
還挺不錯的,只是買了過后遇到讀書節搞活動,有點后悔。
程序員必看,沒事買來拓展下知識,懂得多才值錢!
書的內容很好,很實用。不過,我收到的這本書裝訂上有瑕疵,334頁的下一頁不是335,一下了跳到了431。這個跨越斷篇,我也是無語了。
***TY權威指南(第2版)***TY權威指南(第2版)N10ETTY權威指南(第2版)發6實驗室開發總監黃省江的之處在于它是一個高性能、異步事件驅動的框架,目前很多著名的開源框架開始將樣的?本書都會一一解答。推薦購買:《云