2016年12月23號閱讀筆記

2016年12月23號 持之以恆最重要

簡書地址:nextflower

面試中遇到的算法問題

原文地址:面試中遇到的算法問題
算法

文章中作者提到了2個算法題:
- 斐波那契數列問題-兔子產子經典問題
- java統計出字符串中的英文字母,空格,數字和其他字符的個數

這兩個算是比較基礎的算法題目,斐波那契採用遞歸的方式解決,字符統計通過判斷char的編碼範圍來做統計。

讀後感:

個人感覺這是一個不錯的個人博客,頁面風格簡潔,美觀,但願不要哪天不再支持訪問了。已加入到訂閱列表。以前我也喜歡自己搞個人網站,現在感覺沒那麼多時間去維護了~

理解 Thread.Sleep 函數

原文地址:理解 Thread.Sleep 函數

Java基礎

首先我們知道Thread.sleep(timeout); 函數用於將線程掛起一段時間。

作者提出了2個問題:
- 假設現在是 2008-4-7 12:00:00.000,如果我調用一下 Thread.Sleep(1000) ,在 2008-4-7 12:00:01.000 的時候,這個線程會 不會被喚醒?
- 某人的代碼中用了一句看似莫明其妙的話:Thread.Sleep(0) 。既然是 Sleep 0 毫秒,那麼他跟去掉這句代碼相比,有啥區別麼?

作者首先回顧了一些操作系統原理:Unix系統使用時間片算法,Windows使用搶佔式。
作者用分蛋糕的場景來做比喻,蛋糕(時間)、刀叉CPU、吃蛋糕的人(進程)。

Thread.sleep的作用就是告訴操作系統未來多少毫秒內不參與CPU競爭。

  • 第一題:不一定。只是告訴操作系統自己開始參與CPU競爭,但是不保證立刻獲取執行權。
  • 第二題:有區別,Thread.Sleep(0)的作用,就是“觸發操作系統立刻重新進行一次CPU競爭”。

提到一個概念:其實在Windows原理層面,CPU競爭都是線程級的

讀後感:

涉及到操作系統中CPU資源分配的原理,以及Thread.sleep();在此過程中起到的作用。希望可以通過閱讀《Java編程思想》、《操作系統實現與原理》2本書做更深入的瞭解。前一本已經讀過幾遍,後一本正在讀。


觀察者模式和Spring的結合:

原文地址:觀察者模式和Spring的結合

設計模式 模式實例

本文作者提到的一個需求:每次熱部署後,對查詢回來的數據進行各種各樣的過濾,將過濾的數據保存到不同的容器中。一開始的思路是,使用定時器,定義一個過濾類,將數據進行過濾分發。

初始思路的弊端:
- 不利於擴展,如果後續新增其他過濾方式的話,需要改處理類中的代碼。

解決思路:
將每個過濾條件作爲一個觀察者對象。通過spring的方式將多個過濾條件註冊到主題上。當主題內容發生變化時,notify所有的觀察者對象。

原文作者感悟:

很多的知識不是會了就會了,在自己的腦子裏存着是一回事,能在特定的業務場景下能用上是另一回事。有些知識沒用時覺得難,但是用過了之後就覺得真的不是很難。多實踐。

讀後感:

個人感覺,文章中的實例代碼的類名會有些誤導,總會把Filter和web的Filter想到一塊去,其實裏面Filter是上面提到的過濾的意思。以前的理解,觀察者模式中,要有主題、觀察者。本文中的主題就是熱部署對象HotDeployManager,它繼承自抽象主題AbstractPriceFilter。
抽象主題中有個存放觀察者的容器,這個容器的初始化是通過spring的MethodInvokingFactoryBean方式來注入的。這樣做的好處是當有新的觀察時,不需要修改代碼,只有在spring的配置文件中新增一個ref的觀察者對象即可。做到了符合開閉原則。不過文中作者提到的解耦,我感覺並不是因爲使用了觀察者模式才解決的,而是因爲使用了spring容器。作者使用觀察者模式只是解決了業務的基本需求。
PS: 我目前對觀察者模式還沒有深入研究,以後再看。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章