[转]当你疲倦时,当你想放弃时,看看这个吧!

七月 1st, 2010 0 条评论/336次阅读

f5614a4c35e9d207a8904e5f06c2d8de

第一幅漫画中,每个人都背负着一个沉重的十字架,在缓慢而艰难地前行!­

4dc8c2048a19cd9f88885b04fdcdf76e

途中,有一个人忽然停了下来。他在想着什么!­

bf7232fb5a01eb9939501177d12d6683

他想,上帝啊,这个十字架太沉重了,我可以把十字架砍掉一块!

93717b8fd266960b1ae4479bb26005fd

于是他动手砍了起来!­

bbbec33260ae09d5fd89d16c8fed4b96

砍掉之后走起来,的确是轻松了很多,他的步伐也不由得加快了。­

9c990c4b9c73b10dc6f6b75c94d7c1b3

就这样走啊走啊!走着走着,他觉得肩上的十字架还是很沉,很重!­

688312fdaa42fb6d95ea573934414e56

他祈求道,上帝啊,请你让我再砍掉一截吧,我会走得更轻松!­

ad29d6516c6a0b9efe196b8e54e06b29

于是,他又砍掉了一截!­

726b99cf579011c185fa5d8c103ef809

感谢上帝,这样一来,他感到轻松多了!­

8fd2f4b2db4207a1d4cfbbd1ed2251dc

如此,他毫不费力地就走到了队伍的最前面。当其他人在吃力地负重前行时,他却轻松地哼起了小曲!

c96e0a5b2a50f6b43609456387b439eb

啊哈!谁料,前边忽然出现了一个又深又宽的沟壑!沟上没有桥,周围也没有路。也没有蜘蛛侠或者超人出来解救他…­

35c0b13c0ae586207b46f48214d071f2

后面的人都慢慢地赶上来了,他们用自己背负的十字架搭在沟上,做成桥,从容不迫地跨越了沟壑。

e9c1a5b5989d5dbe3bc701b1d7012819

他也想如法炮制。只可惜啊,他的十字架之前已经被砍掉了长长的一大截,根本无法做成桥帮助他跨越沟壑!­

1bfd8543d9f8012f6a04e242047bee70

于是,当其他人都在朝着目标继续前进时,他却只能停在原地,垂头丧气,追悔莫及……­

人生的路上我们每个人都背负着各种各样的十字架在艰难前行。它也许是我们的学习,也许是我们的工作,也许是我们的感情。但是,正是这些责任和义务,构成了我们在这个世界上存在着的理由和价值。所以,请不要埋怨学习的繁重,工作的劳苦,感情的负担,因为真正的快乐,是奋战后的结果,没有经历深刻的痛苦,我们也就体会不到酣畅淋漓的快乐!­

每个人都背负着属于自己的十字架,的确是这样,漫画中的每个人,都是背负着属于自己的十字架,而当沟壑出现时,他们也只能利用自己背负的十字架去跨越沟壑,继续前进。­

所以:在人生的道路上,有些黑暗,只能自己穿越;有些痛苦,只能自己体验;有些孤独,也只能自己品尝……人生是没有捷径的!

分类: 杂谈

[转]深入研究Servlet线程安全性问题

五月 17th, 2010 0 条评论/260次阅读

       Servlet/JSP技术和ASP、PHP等相比,由于其多线程运行而具有很高的执行效率。由于Servlet/JSP默认是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程的安全性问题。然而,很多人编写Servlet/JSP程序时并没有注意到多线程安全性的问题,这往往造成编写的程序在少量用户访问时没有任何问题,而在并发用户上升到一定值时,就会经常出现一些莫明其妙的问题。

Servlet的多线程机制

        Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多个线程在使用这个实例。Servlet容器会自动使用线程池等技术来支持系统的运行,如图1所示。

        E3F5AE45CB2AEDD172224A78824EAF9D

        这样,当两个或多个线程同时访问同一个Servlet时,可能会发生多个线程同时访问同一资源的情况,数据可能会变得不一致。所以在用Servlet构建的Web应用时如果不注意线程安全的问题,会使所写的Servlet程序有难以发现的错误。

Servlet的线程安全问题

Servlet的线程安全问题主要是由于实例变量使用不当而引起的,这里以一个现实的例子来说明。

Import javax.servlet. *;
Import javax.servlet.http. *;
Import java.io. *;
Public class Concurrent Test extends HttpServlet
{

PrintWriter output;
Public void service (HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {String username;
Response.setContentType ("text/html; charset=gb2312");
Username = request.getParameter ("username");
Output = response.getWriter ();
Try {Thread. sleep (5000); //为了突出并发问题,在这设置一个延时
} Catch (Interrupted Exception e){}
output.println(" 用户名:"+Username+"
");
}
}

该Servlet中定义了一个实例变量output,在service方法将其赋值为用户的输出。当一个用户访问该Servlet时,程序会正常的运行,但当多个用户并发访问时,就可能会出现其它用户的信息显示在另外一些用户的浏览器上的问题。这是一个严重的问题。为了突出并发问题,便于测试、观察,我们在回显用户信息时执行了一个延时的操作。假设已在web.xml配置文件中注册了该Servlet,现有两个用户a和b同时访问该Servlet(可以启动两个IE浏览器,或者在两台机器上同时访问),即同时在浏览器中输入:

a: http://localhost: 8080/servlet/ConcurrentTest? Username=a
b: http://localhost: 8080/servlet/ConcurrentTest? Username=b

如果用户b比用户a回车的时间稍慢一点,将得到如图2所示的输出:

45B48A64DDF117083FF2E073283559FD

从图2中可以看到,Web服务器启动了两个线程分别处理来自用户a和用户b的请求,但是在用户a的浏览器上却得到一个空白的屏幕,用户a的信息显示在用户 b的浏览器上。该Servlet存在线程不安全问题。下面我们就从分析该实例的内存模型入手,观察不同时刻实例变量output的值来分析使该 Servlet线程不安全的原因。
Java的内存模型JMM(Java Memory Model)JMM主要是为了规定了线程和内存之间的一些关系。根据JMM的设计,系统存在一个主内存(Main Memory),Java中所有实例变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Working Memory),工作内存由缓存和堆栈两部分组成,缓存中保存的是主存中变量的拷贝,缓存可能并不总和主存同步,也就是缓存中变量的修改可能没有立刻写到主存中;堆栈中保存的是线程的局部变量,线程之间无法相互直接访问堆栈中的变量。根据JMM,我们可以将论文中所讨论的Servlet实例的内存模型抽象为图3所示的模型。

C2B200DA4F09F0271E2CA42CD5CF096A

 

下面根据图3所示的内存模型,来分析当用户a和b的线程(简称为a线程、b线程)并发执行时,Servlet实例中所涉及变量的变化情况及线程的执行情况,如图4所示。

调度时刻 a线程 b线程
T1 访问Servlet页面  
T2   访问Servlet页面
T3 output=a的输出username=a休眠5000毫秒,让出CPU  
T4   output=b的输出(写回主存)username=b休眠5000毫秒,让出CPU
T5 在用户b的浏览器上输出a线程的username的值,a线程终止。  
T6   在用户b的浏览器上输出b线程的username的值,b线程终止。

从图4中可以清楚的看到,由于b线程对实例变量output的修改覆盖了a线程对实例变量output的修改,从而导致了用户a的信息显示在了用户b的浏览器上。如果在a线程执行输出语句时,b线程对output的修改还没有刷新到主存,那么将不会出现图2所示的输出结果,因此这只是一种偶然现象,但这更增加了程序潜在的危险性。

通过上面的分析,我们知道了实例变量不正确的使用是造成Servlet线程不安全的主要原因。下面针对该问题给出了三种解决方案并对方案的选取给出了一些参考性的建议。

1、实现 SingleThreadModel 接口
该接口指定了系统如何处理对同一个Servlet的调用。如果一个Servlet被这个接口指定,那么在这个Servlet中的service方法将不会有两个线程被同时执行,当然也就不存在线程安全的问题。这种方法只要将前面的Concurrent Test类的类头定义更改为:

Public class Concurrent Test extends HttpServlet implements SingleThreadModel {
…………
}

2、同步对共享数据的操作
使用synchronized 关键字能保证一次只有一个线程可以访问被保护的区段,在本论文中的Servlet可以通过同步块操作来保证线程的安全。同步后的代码如下:

…………
Public class Concurrent Test extends HttpServlet { …………
Username = request.getParameter ("username");
Synchronized (this){
Output = response.getWriter ();
Try {
Thread. Sleep (5000);
} Catch (Interrupted Exception e){}
output.println("用户名:"+Username+"
");
}
}
}

 

3、避免使用实例变量
本实例中的线程安全问题是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的。
修正上面的Servlet代码,将实例变量改为局部变量实现同样的功能,代码如下:

……
Public class Concurrent Test extends HttpServlet {public void service (HttpServletRequest request, HttpServletResponse
Response) throws ServletException, IOException {
Print Writer output;
String username;
Response.setContentType ("text/html; charset=gb2312");
……
}
}

对上面的三种方法进行测试,可以表明用它们都能设计出线程安全的Servlet程序。但是,如果一个Servlet实现了SingleThreadModel接口,Servlet引擎将为每个新的请求创建一个单独的Servlet实例,这将引起大量的系统开销。SingleThreadModel在Servlet2.4中已不再提倡使用;同样如果在程序中使用同步来保护要使用的共享的数据,也会使系统的性能大大下降。这是因为被同步的代码块在同一时刻只能有一个线程执行它,使得其同时处理客户请求的吞吐量降低,而且很多客户处于阻塞状态。另外为保证主存内容和线程的工作内存中的数据的一致性,要频繁地刷新缓存,这也会大大地影响系统的性能。所以在实际的开发中也应避免或最小化 Servlet 中的同步代码;在Serlet中避免使用实例变量是保证Servlet线程安全的最佳选择。从Java 内存模型也可以知道,方法中的临时变量是在栈上分配空间,而且每个线程都有自己私有的栈空间,所以它们不会影响线程的安全。
小结
Servlet的线程安全问题只有在大量的并发访问时才会显现出来,并且很难发现,因此在编写Servlet程序时要特别注意。线程安全问题主要是由实例变量造成的,因此在Servlet中应避免使用实例变量。如果应用程序设计无法避免使用实例变量,那么使用同步来保护要使用的实例变量,但为保证系统的最佳性能,应该同步可用性最小的代码路径。

分类:

[转]缓解压力的5项训练

五月 15th, 2010 0 条评论/239次阅读

 

压力有时可以激励人进步。但是那些对未来的忧虑忧虑、对不同的情境下产生的心理压力等等,常常有着潜在的深刻后果。比方说:对生理和心理上的反作用,使人容易疲倦、暴躁、焦虑。更重要的是,它会把我们的身体击垮,使我们易于患病。

因此,学会如何解压是当我们面对压力时必须具备的一项能力——排除压力需要具体的方法,下面的一些有效的建议你不妨试试:

  • 学会丢包袱

生活中繁杂的事务会将我们宝贵的时间和精力支解,使我们没有充足的时间和精力去执行最重要的事情。这时,你会感觉到很大的压力。有效的办法是先分析一下什么对你是最重要的,哪些事情是次要的,重要的事情先做,次要的少做或不做,这样就可以为自己赢得宝贵的时间。参考阅读《为什么要区分紧急与重要任务

  • 善待自己,放低标准

不要对自己太苛刻了,至善至美只是一个遥远的梦,摆脱完美主义的束缚吧!不要妄想把所有的事情都干得完美无缺。适当放低一下标准,放松一下自己的心情,或许在客观上也减轻了别人的压力。

  • 远离虚荣

在生活中,许多压力是完全由于自己的虚荣心导致的。为了穿名牌时装、用高档化妆品,住漂亮豪华的房子……不得不拼命地嫌钱,无端地增加了自己的压力。金钱、名誉、地位这些如同过眼云烟,却常常被人视为是最重要的东西,为之所累。学会真正地享受生活,摆脱虚荣。

  • 给自己留一点儿思考的时间

压力的产生也可能是因为对事情本身的理解造成的。过分夸大了事情的重要性和后果,导致心理负担加重。不少人往往因为急于求成,而忘记了对事情本身的思考。留一点儿时间思考能让你更清楚地看到事情本来的面目,同时也给了自己一下解剖情绪、分解压力的机会。

  • 不要忘了休息

过重的劳动会导致人生理疲劳,效率低下,从而导致过分的焦急与紧张。适当的休息不但会缓解大脑疲劳,而且可以放松一下紧张的心情,减轻心中的压力。特别是上班族,周末应好好休息一下,毕竟工作不是生活的全部。

分类:

maven 自动生成struts2 Web应用

四月 14th, 2010 0 条评论/744次阅读

       因工作需要近期开始学习使用maven来进行项目的构建和发布,参考了网上很多的资料,实验后能正常运行的很少,最后发现还是官方的最为详细,整理出来方便以后回顾

  1. installing eclipse

       http://www.eclipse.org

   2.  intalling maven2

       http://maven.apache.org

   3.  installing tomcat

       http://tomcat.apache.org

(..More)
分类: java

流程设计实战

四月 9th, 2010 0 条评论/225次阅读
twitter上看到这个ppt,看完后有些感触,一个系统无论后台多么强大,在客户这一端在意的还是使用的体验,在互联网应用变得越来越复杂的今天,流程的设计尤为重要[Sdo分享会]单线流程思想 流程设计实战技巧总结
View more presentations from mooqii.
分类:

[转]“熄灯一小时”会破坏电网吗?

四月 6th, 2010 0 条评论/249次阅读
1-2741 文:潘龙(北京交通大学) 今年的“地球一小时”比去年的热闹了许多。一方面,参与的城市和人口增加了,另一方面,反对者的声音也更响亮了。这短短的一个小时究竟能给我们带来什么?这个活动真有实际的环保意义吗? “地球一小时”能减少的用电量主要是来自照明用电,这部分用电量在国民用电总量中大约只占10%。这其中又只有少部分参与了熄灯活动。因此,在活动中减少的电能消耗量是微乎其微的。从电力部门介绍的情况来看,今年的“地球一小时”活动期间,北京市的用电负荷几乎没有减少。 既然电量的变化是微小的,那么它对电力系统的影响也就有限了。有人担心,该活动的参与者在同一时间开灯、熄灯,瞬时的电压波动很可能造成供电线路瘫痪。不过,这种极端情况几乎不可能发生。首先,参与“地球一小时”活动的人能够控制的用电量是有限的,即便是不能预估人们的参与规模,但是预估用电量的变化并不困难;其次,开灯、熄灯的同一性没必要也不可能非常精确,一瞬间统一熄灯和开灯的情况不大容易出现。实际出现的情况就在活动开始前后,出现一次熄灯、开灯的小高峰。而这期间的用电量都是相对稳定的;最后,即便是出现了瞬间的同时开灯和熄灯,电力系统也不至于瘫痪。在发电机组与用户之间,有着一个设计科学、功能强大的复杂的输电网络,这个多区域多层级的网络无时无刻不在应对用电量的起伏变化。例如,城市交通照明的规模和开关同时性都远超参与“地球一小时”活动的分散用户,电力系统仍然保持着正常的运转,对电网的冲击是有限的,更不会对发电设备造成破坏。 那么,如果“地球一小时”大规模推行起来,会影响一座城市的电力供应吗?答案是否定的。原因很简单,发电机组的运转往往反应迟缓,通常来说,国内的煤电站从开始启动到正常发电大概需要三天的时间,核电站、气电站的速度略快些,但希望发电量随时根据用电量的变化而变化仍是不可能的。 在日常电力供应中,类似的情况一直都存在。众所周知,日常用电存在“峰谷差异”。电厂总是要按照一定的发电总量来运转,但每天各时段的电力消耗却并不相同。高峰时段电力不够用,低谷时段多出来的电又没人使,所以电厂不得不采取“削峰填谷”的方法解决这个问题。 在技术层面上,“削峰填谷”就是将用电低谷期富余的电能转化为其他形式的能量储存起来,等到用电高峰期再将这些能量用来发电。不过,储存和释放的过程会造成能量的损失。从政策层面上,“削峰填谷”主要是价格引导,实行分段电价。 了解了这一点就不难发现,靠“地球一小时”的活动本身来节能减排是不可行的。值得注意的是,用电器不必要的启动和停机有时会增加用电负担。如果照明本身使用的是节能灯,那么电灯的开关瞬间消耗的电能比一小时内稳定发光时还要多,刻意地熄灯一小时,也许会得不偿失。在今年的“地球一小时”,有些人甚至用“点蜡烛”的方法度过这一小时,殊不知这个行为本身也会造成碳排放,而且排放量未见得小于开灯。 如此看来,“地球一小时”的实际作用可能并不如一些人期望的那样巨大,同时,它可能产生的不利影响也不如另一些人担心的那样严重。不过,这种活动的实际目的更多的是造成“新闻效应”,唤起公众对于环境和能源问题的关注。从这个意义上说,“地球一小时”也确实挺有意义。 如今,环保已经成为社会公众关注的一个焦点话题。环保固然是一个社会话题,更是一个科学话题,需要科学理性的操作方式。将“地球一小时”的节能精神推广到日常生活当中,减少能源浪费,减缓城市电力需求增长速度,这才是真正的环保之道。 文字编辑:拇姬 图/CFP 新京报《新知周刊》 © 本文来自科学松鼠会http://songshuhui.net,转载请注明出处。
分类: 杂谈

[转载]在国内被禁,在国外却火了的文章,极为精彩

四月 6th, 2010 0 条评论/269次阅读

我的祖国已经越来越显现出浮躁,狂热,悲哀,迷茫的气息。社会在财富的迅速积累下,糜烂与堕落,国富民衰的迹象越来越明显,各级政府处处想着与民争利,社会两极分化异常严重。富人们肆无忌惮的忘乎所以,穷人们走投无路般的苟延残喘,青年人的思想在社会的约束中扼杀,中年人的幸福被居高不下的房价击碎,老年人的健康被日益污染的环境毁灭。学术界一潭死水,文化界死水一潭,政治界腐败堕落,娱乐界本着娱乐至死的精神,麻痹所有还有一丝想要抗争与改变的人们,所有中国人都在争骗抢夺,生怕自己被别人挤下去。高油价,高房价,与民争利的地方政府绑架了整个中国的向前发展,弱小的人民只有在网上穿着马甲,搞笑娱乐,无奈自嘲,解构雷人。这便是如今国家最大的可悲。看似表面的欢声笑语一团和气掩盖着深深的悲哀。看似繁荣向上的祖国,却处处充满了不可预测的危机。作为一名普通的中国年轻人,我担心未来的国家会像虚幻的巴比伦之城一样在顷刻间坍塌毁灭。所以,我亲爱的祖国,请你不要继续堕落了。

(..More)
分类: 杂谈

搞笑漫画图解几大浏览器的区别

三月 17th, 2010 0 条评论/256次阅读

Internet Explorer, Firefox, Google Chrome, Opera 和 Safari之间的到底有啥区别,
下面这几幅搞笑漫画或许能说明什么…

1337380755381427

Internet Explorer:没什么用,偶尔还真能派上用场…

(..More)
分类: 杂谈

无病呻吟

三月 8th, 2010 0 条评论/200次阅读

751457_823279 

整理google reader上的内容,读到一篇写在一个我写了一半就没有再更新的blog中的心情小记,过了将近两年的时间,感觉自己还是在当初的状态中难以自拔。最近看了些关于心智的书籍,意识到情绪也只不过是大脑的第一反映,是没有经过加工和处理,被情绪所控所表现出来的举动往往都是不理智及不合理的。把这篇文章转来这里,时刻提醒自己,学会控制情绪而不是被情绪所控制,运用心智,才能获得解放,学会let it be

2007年8月6号,天还是这么热, 困扰了一周的感冒终于好了,长了这么大还是离开不了家里的照顾,不知道什么时候才能真正脱离家庭的庇护,虽然主观上很不情愿,但这一天总是要来。可能是因为身体原因或是工作没有完成,最近情绪一直很低落,上班了和学校里真的不一样,工作一直都像块石头一样压在心里,没完成的工作时不时的就会在脑海里浮现出来,我不喜欢这样的生活,但我喜欢这个行业,这应该是每个刚入行的程序员都要遇到的问题,相信随着能力的提高,这种感觉会越来越清。由于上周状态不佳,工作方面就不总结了,希望这周能有所突破!

分类: 杂谈

javascript的几个quiz

三月 5th, 2010 0 条评论/182次阅读

Example #1

var num1 = 5,

num2 = 10,

result = num1+++num2;

这个例子的关键在于了解javascript操作符的优先级。显然+++并不是有效的操作符,所以javascript引擎会把它分为++和+。上面的代码会正常执行,等同于以下代码:

var num1 = 5,

num2 = 10,

result = num1+++num2;

  • result的值是多少?result=15因为自加操作在num1+num2后执行
  • num1的值是多少?num1=6因为在num1+num2之后执行了++操作
  • num2的值是多少?显然num2=10
(..More)
分类: javascript