2016年12月23號 持之以恒最重要
CSDN主頁:破光之流風
面試中遇到的算法問題
原文地址:面試中遇到的算法問題
算法
文章中作者提到了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: 我目前對觀察者模式還沒有深入研究,以后再看。