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: 我目前对观察者模式还没有深入研究,以后再看。