日常啰嗦

不要被標題嚇到,雖然書籍是《實戰java高并發程序設計》,但是這篇文章不會講高并發、線程安全、鎖啊這些比較惱人的知識點,甚至都不會談相關的技術,只是寫一寫本人的一點讀書感受,順便整理了一下書中的代碼,放到github里了。

書籍簡介

書籍封面 當時在京東選書的時候就是被這本書的封面給吸引了,莫名的挺喜歡這本書,剛好那段時間也想補充一下這方面的知識點,看了一下書籍簡介就下單購買了。

2017年4月10號開始讀,到30號讀完,中間的二十天基本都是抽出中午的一小段時間看書,每天雖然看的不多,但是加在一起就不一樣了,事情總會做完的,讓我想起高中時物理老師的一句話:

“小步走,不停步,等于前進一大步”

雖然分開來看量很小,但是慢慢積累下來,概念就不同了。

整本書看下來感覺還不錯,案例的數量很大、質量也很高,動手實踐一下得到了不小的收獲,也達到了買書前的預期,理論知識不是特別的晦澀難懂、代碼也很清晰,對這本書的好評是遠遠多于差評的,知識點豐富、學到了想要學的知識點。

下面是書籍的部分目錄,不想看可以跳過去:

第1章 走入并行世界 1
1.1 何去何從的并行計算 1
1.1.1 忘掉那該死的并行 2
1.2 你必須知道的幾個概念 6
1.2.1 同步(Synchronous)和異步(Asynchronous) 7
1.2.2 并發(Concurrency)和并行(Parallelism) 8
1.2.3 臨界區 9
1.2.4 阻塞(Blocking)和非阻塞(Non-Blocking) 9
1.2.5 死鎖(Deadlock)、饑餓(Starvation)和活鎖(Livelock) 9
1.3 并發級別 11
第2章 Java并行程序基礎 29
第3章 JDK并發包 70
第4章 鎖的優化及注意事項 138
4.1 有助于提高“鎖”性能的幾點建議 139
4.1.1 減小鎖持有時間 139
4.1.2 減小鎖粒度 140
4.1.3 讀寫分離鎖來替換獨占鎖 142
4.1.4 鎖分離 142
4.1.5 鎖粗化 144
4.2 Java虛擬機對鎖優化所做的努力 146
4.3 人手一支筆:ThreadLocal 147
4.3.1 ThreadLocal的簡單使用 148
4.3.2 ThreadLocal的實現原理 149
4.3.3 對性能有何幫助 155
4.4 無鎖 157
4.4.1 與眾不同的并發策略:比較交換(CAS) 158
第5章 并行模式與算法 184
5.1 探討單例模式 184
5.2 不變模式 187
5.3 生產者-消費者模式 190
5.4 高性能的生產者-消費者:無鎖的實現 194
5.4.1 無鎖的緩存框架:Disruptor 195
5.4.2 用Disruptor實現生產者-消費者案例 196
5.4.3 提高消費者的響應時間:選擇合適的策略 199
5.4.4 CPU Cache的優化:解決偽共享問題 200
5.5 Future模式 204
5.5.1 Future模式的主要角色 206
5.5.2 Future模式的簡單實現 207
5.5.3 JDK中的Future模式 210
5.6 并行流水線 212
第6章 Java 8與并發 251
第7章 使用Akka構建高并發程序 289
7.1 新并發模型:Actor 290
7.2 Akka之Hello World 290
7.3 有關消息投遞的一些說明 293
7.14 參考文獻 330
第8章 并行程序調試

讀書筆記

書中就是知識點的介紹,還有一些代碼案例,作者講解的也挺詳細的,這篇文章里就不會講了,都是些概念性的知識。 書是好書,案例也是好案例,個人看來,這本書也是有缺點,當然,這個只是個人看法,對這本書最大的槽點應該就是插圖了:


書中的插圖基本都是這個風格,而且由于印刷原因有些插圖有些不清楚,因此最大的槽點是這個。

  • 第一次啃書的過程中,并沒有特別跟著作者的思路去敲代碼案例,只是用筆在書本里做了一些注釋,因為我覺得網上應該會有相關的源碼資源,結果是我找了挺久沒找到,因此就自己動手寫了一遍,我覺得應該也有人和我一樣懶得去敲一遍代碼,所以就打算公布在網上了。
  • 代碼里都是兩個線程,下載了源碼后,可以自行在編輯器里模擬多個線程的運行情況。
  • 對線程和高并發的認識有所加深,這次寫文章、整理源碼的過程中又讀了一遍全書,感覺收獲頗豐,印象更加深刻了,可能過一段時間又忘了,誰知道呢。

看第一遍的時候,其實有過思想準備,也對自己說過,如果書本中理論感太強,就慢慢看,一天翻個幾頁,如果代碼案例多的話,就多敲敲代碼??戳酥蟀l現,有些章節確實比較偏理論,不過耐下心來也是能看得下去,每天中抽些時間翻個幾頁,慢慢的也就看完了,至于敲代碼這件事就沒去做,因為我覺得網上應該會有相關的資源的,哪知道,一條都沒。

印象比較深的幾個知識點是指令重排、比較交換CAS、ThreadLocal、讀寫鎖優化,在這里提一下,詳細的我就不寫了,想了解的朋友自行搜索,這些知識點書里都做了詳細的介紹,會讓你收獲滿滿的。

讀書心得

不知道大家有沒有這種感覺,對多線程、鎖這種知識點“又愛又恨”,感覺很近又感覺很遠,想去認真探索一個究竟,但是終究沒能邁出第一步,或者邁出第一步也不想繼續前進了,覺得這些知識點特別難搞。

對線程這一塊兒的知識比較模糊,初學Java的時候,也沒有特別著重的去看,覺得有些晦澀難懂,后來工作了,也沒有接觸過類似的編碼要求,因此造成了一個思維怪圈,對之莫名的好奇,又無法完全說服自己去認真的學習它并對之有一個透徹的理解,平時工作中確實用的不多,而且試著學過,又覺得過程比較枯燥,但是也的的確確知道這個知識點的重要性,也知道一些框架或者工具底層肯定是用到了這些知識點的,只不過是自己沒有動手寫過相關代碼罷了。

其實看這本書,也是因為獵奇心理吧,不想總是對一個知識點有小小的恐懼,我感覺我還是掌握它比較好,如果是一年前,這本書我可能也看不下去,因為那個時候的我還沒養成看書的習慣,一開始學知識都是去百度搜,去看博客等,而且很少主動的學習,更別提去看書了,慢慢的就發現這種碎片式的知識學習方式并沒有徹底解決技能掌握度低的問題,而且知識點太碎了,無法連貫起來形成自己的知識系統,技能棧不全面,所以從去年開始,開始主動買技術書籍以及技能相關的書籍來看,也慢慢的由一點也看不下去,到強迫自己看一點,再到每天能看幾頁,最后能堅持看完一本,接著是第二本、第三本....

因為想看書了,而且也慢慢的養成了看書的習慣了,因此啃完這本書也就很輕松了,后來因為整理書中的源碼又看了一遍,就算是加深印象了吧。

結語

這篇文章主要是講一下自己的體會,其實都是一些牢騷話,關鍵的是書中的源碼,因為網上確實沒有這本書的相關文檔,因此就自己整理了一下,如果有同樣在看這本書的朋友,不太想自己一點點敲書上的代碼的話,可以直接到我的github倉庫中去下載代碼。 其實我就是不想敲代碼,哈哈哈哈,去網絡上搜了一圈之后,發現根本沒有現成的,只能自己敲了,既然整理好了一部分代碼,索性就上傳到github上,讓大家都看一看,節省一下其他人的時間,github地址是點這里,如果沒法翻墻的話,可以到碼云的倉庫中看,地址是點這里,如果覺得還可以的話,幫忙點個star吧。