2006年9月29日
#
玩电脑写程序多年了,太投入,以至于得了职业病。手指、手腕、肩颈部都经常疼痛,眼睛干涩红痒,肚子也变将军了。
后来在家soho,颈椎问题尤为严重。在网上寻求解决方法,并自行研究实践,有了明显的好转。记录于下,望对使用电脑工作的人有点用处。
1.颈椎问题的严重性:会引发脑部供血、脊柱神经、睡眠等问题。不是专家,网上可自己查找相关资料。
2.原因。久坐少动。肩颈部肌肉劳损以至骨骼、软骨受损。
3.我的解决过程。
买了个太空枕,睡觉时可支撑颈部。效果不明显。
后来每周按摩1小时。你要想有点效果一定得到正规的地方,还得受得了疼。按一次,得疼三天。有是有点用,回想一下,这不是花钱找罪受么?
然后去了曙光医院,医生给开了一些药,问了,大概都是缓解症状的,不能治本。
---我一向不同意程序员30岁转行的观点,难道我过不去这个坎?---
转而采取日常生活中自己注意保健。一般来说,主流的意见是多运动。包括体育运动和针对性的保健操。
我在家实践了两个月,3天一次长跑或羽毛球,每天一次散步和多次保健操。效果不算明显。
后来我从源头上着手。
硬性的就是减少坐在电脑前的时间,打游戏不打了,工作时想问题就起身。这个也不易。这个对工作有一定影响,但也是重要方法之一。
软的是调整桌椅高度及坐姿。桌椅一定是符合三个90度:坐着膝盖90度,大腿和上身90度,肘部90度。
肘部一定要有依托,至少有椅子的扶手,我现在是用了大桌子,对着90的圆弧,两肘都放在桌面上。
现在我的颈椎问题已经好多了。
总结一下,方法是综合的。但效果最明显的就是桌椅。其中最关键的就是肘部的依托,肘部放在桌面上我觉得是挺有效。
另外,不能觉得没有时间想健康问题,否则结果是不得不想。拿出你打游戏、写程序的劲头对待健康,肯定能解决问题的。
2006年9月11日
#
www.lucas-lee.com
免费软件,非开源软件。
纯JAVA开发,B/S架构。目前支持MySQL5.0.21及以上数据库。
预定义了多种缺陷处理流程,可选择使用。
- 小型团队自由流程
由当前处理者指定下一个处理者,流程比较灵活。
- 小型团队受控流程
以项目经理为中心的流程,提交后的审核、转交程序员、修改后的验证等步骤都由项目经理控制。
- 单人流程
只有一个使用者的流程。适合个人软件的开发过程。
缺陷统计功能。使用琴棋报表。
邮件提醒。流程转入下一步骤后,系统会自动发邮件给下一处理者。
字典数据可自定义。优先级别、严重程度、项目、模块等等。
基于角色--用户组--用户的权限控制。
www.lucas-lee.com
1)解决了Excel格式输出大量单元格时出现的Excel样式过多的问题。
2)优化了clone的算法。
2006年9月1日
#
所谓字典就是数据库应用中被其他表(通常加以外键约束)引用的表,如客户表引用客户类型,那么客户类型即为字典表。删除字典数据要考虑是否已被其他数据引用,一般不允许做级联删除。
这个问题想必大家都碰到过,但各有各的 做法。本人与若干同事讨论过,将各种做法总结一下。
- 物理删除,即用delete SQL删除。如果字典数据被引用,则会抛出违反外键约束的异常,将其封装为可读的信息提示给用户。JDBC中的异常类为SQLException,如何判断是违反外键约束的异常呢?有方法如下:
- 利用SQLException中的errorCode,这是数据库特有的错误编码。
- 利用SQLException中的SQLState,在JAVA API DOC中说明这个是SQL99或XOPEN 标准的编码,而且可以用connection的meta data来判断符合哪个标准。经过的试验,说明这个meta data不太好用,但是SQLState还是较为统一的。
| mysql5.0.21 | sqlserver2000 | oracle10 | postgresql8 |
ANSI99 SQLState标准的违反外键约束编码为:23000 | 23000 | 23000 | 23000 | 23503(可能要在BatchUpdateException的nextException中才能取得) |
Connection的meta data中的getSQLStateType(),符合SQL99标准应该为2 | 2 | 2 | 0 | 2 |
- 逻辑删除。即置表中的一个标记字段为已删除。查询时不可见,但实际还保留在表中。 好处是不用处理数据被引用的情况。它的缺点是,如果数据没有被引用,那么它其实可以被物理删除,但确留在系统中成为垃圾数据;其次在数据有唯一编码的情况下,被逻辑删除的数据实际上还占用着一个编码,有时用户会疑惑,明明表中查不到这个编码,我在新增的数据中使用这个编码却总提示编码已存在。
各位又是用的什么方法来处理的呢?你的方法有何优缺点,不妨一同讨论一下。
2006年7月9日
#
[一.奠定基础]
1. 任何不能改善产品的工作,都是浪费时间或是偏离方向。
2. 领导者的任务是努力消除程序设计师工作上的一切障碍,让程序设计师全力专注在真正重要的工作─改善产品。
3. 千万不要把程序设计师的时间浪费在改善产品以外的工作上。
4. 永远记得自己真正的目标,然后让团队用最有效又最愉快的方法把它完成。
5. 理清详细的项目目标,可以避免在不必要的工作上浪费时间。
6. 不要因为制定目标需要花很多时间,或是别人都没有做,就省略了目标的制定。制定明确详尽的目标所花的时间,绝对会让团队得到更大的好处。
7. 事前决定最合适的优先考虑顺序,以及各考虑点的质量规范,能够指引开发团队的工作。
[二.策略性的作业方式]
8. 错虫愈晚清除,时间花得愈多。毕竟,您得知道程序是怎么写的,才能判断那里出了错虫;刚写完的程序记忆犹新,一年前写的程序可能早就忘了
。
9. 在开发的过程就立即除虫,可以让您早些学到经验,然后就不会再犯同样的错误;相反地,如果到了项目后期才发现,您可能已经犯过多次同样的错误而不自知。
10. 发现错虫而立即除错是一种缓冲器,提醒那些讲求快速而不够谨慎的程序设计师,以后多加小心。如果您坚持错虫全都清除了才能开发新的功能,就可以防止所有的程序处于半完成状态,因为错虫太多而使项目延误乃至无法推出;相反地,如果您允许错虫的存在,等于是埋下了项目失控的地雷,最后看似完成的项目,其实已经失控。
11. 若能保持没有任何错虫,您就能比较准确估出项目的完成时间。不必猜测3 2项功能和1 742个错虫共要花费多少时间,只要估算3 2项功能的工作时间就行了。更重要的时,万一到时候有些功能做不完,您可以做多少算多少,因为软件一直保持在无错误状态。
12. 不要把策略性工作方式当作训练的教条,应该向组员解释这些工作方式的内涵与用意。
13. 提出精确详尽的问题,可以引导出真正有效的策略性工作方式,帮助项目目标顺利完成。
14. 策略不是死的定律,要把它当作指导原则来活用。大部分的时候都应该遵循,但也有例外的时候。
[三.保持进度]
15. 定期暂停手边的工作,然后往前思考,随时做必要的修正,以避免未来的大障碍。
16. 有什么事情是我今天能做,而且可以帮助项目在未来几个月内顺利进行的?
17. 不要浪费时间在错误的问题上,一定要先确定真正的问题在哪里,然后才去改正它。
18. 人们开口要求的东西未必是他真正想要的。处理他的要求之前,请务必确定他究竟想要做什么。
19. 绝对不要答应别人自己做不到的事情,这样对双方都有益无害。
20. 不要为了讨好别人而伤害双方的工作进程,您永远要根据自己的目标,做适当的决策。
21. 是您在为项目负责。不要让任何人的建议阻碍项目的进行,包括上级的建议。
22. 天下没有真正免费的软件
23. 应该开发策略上具有重要性的功能,而不是把媒体的评比项目都做齐全。
24. 软件产品的开发,不能只为了有趣、挑战性,或是够有个性够令人眩目。
25. 不要把时间浪费在无法改善产品的工作上,即使这么做在将来会有潜在的利益,也要与现在投入的时间成本做个衡量。
[四.走向极端的狂热]
26. 确定您所要求的报告真的值得属下暂停工作,花那么多时间去写。
27. 利用项目检查报告来改进软件开发的工作程序。为了使报告发生作用,报告中必须确实描述我们这次解决问题的每一个详细步骤,以及将来应该如何运用这项新发现。
28. 请注意定期会议的价值,确定它值得每个人放下手上的工作。
29. 召开任何会议之前,请确定本次会议的目的是什么,达成这个目的的条件是什么,然后,务必达到开会的目的。
30. 试着排除不必要的后续工作。
[五.进度狂]
31. 不要利用进程表来驱使项目的进行,这对小组的士气伤害太大了。
32. 让日程表维持适度的紧迫,但又是可以做到的,好让组员振奋、不松懈,专心致力于项目的推进。
33. 绝对不要草率定出不可能的期限,导致组员为了赶进度而损害产品的质量。
34. 把长期的大项目,分成几个完整而独立的小项目,各小项目必须有一个主题。
35. 为了保持创意的活力和团队士气,必须让每一个小项目都有令人兴奋的结果。
36. 产品的质量远比遵守期限重要.
[六.学无止境]
37. 不要让程序设计师的学习停滞不前,要让程序设计师有机会磨练不同领域的技术,培养十八般武艺样样精通的组员。
38. 训练新进程序设计师时,先培养他对整个公司所有项目都有价值的技术,然后才培养本项目独有的技术。
39. 不要舍不得放您最优秀的程序设计师到别的项目去。如果他在您的项目已经没有新的东西可学,为了公司和他个人的前途,您应该把他推荐到别的项目,让他的成长永不间断。
40. 确定每位组员、每两个月都有一项技术上进步。
41. 一发现某处需要改进,就立即采取更正的行动。
42.不要用年终考评来订立学习目标,要利用年终考评来记录个人的成长。
43. 绝对不要让组员一直做同样的工作,这样是限制了他的学习,使他停滞在原来的领
域。一旦程序设计师精通了某一个领域,就让他换别的领域做做看,永远让他们学习新的技术。
44. 各种技术的用途范围有所不同,有的技术在一般的项目都用得上,有的技术只有在特定性质的项目才用得上。当您训练您的组员时,必须让他们的技术能在公司发挥最大的用处,最好的办法就是,把应用范围最广的技术放在训练的最前期,应用范围最小的技术放在最后训练。
45. 优秀的程序设计师是项目经理最需要的,所以经理们通常舍不得让自己手下功力最强的人到别组去,但是如果这位第一高手在本组内再也没有新东西可学时,经理就应该让他到别的项目去,一方面他个人可以重新开始另一次的成长,一方面让接替他的人学着承担重要的工作,最后公司的平均程序技术水准因而提升,对大家都很有好处。
46. 为了确保每位程序设计师的技术都在稳定地进步,一定要让每个人有个努力的目标,最好的方法是把个人的成长和项目每两个月的阶段性目标相结合,这样一年就有至少六次的进步了。假定一位组员在公司待了五年,那么他就学了3 0种新技术、或是读了3 0本好书、或是1 5项技术加1 5本书,对他的工作能力影响多大啊。
47. 最好的成长目标是出于当时的需要。如果您发现有位组员工作缺乏效率,或总是在犯同样的错误,最好抓住机会立即为他立一个目标,并且要求他立刻开始改进。这种当时设立的目标让人印象深刻,又是马上寻求改善,效果通常会非常好。比起年终考评那种模模糊糊的建议,更能引起程序设计师的重视。
[七.态度问题]
48. 要让每一位程序设计师都明白,写出零错误程序是很不容易的,所以应该多花功夫用各种方法做最彻底的测试。
49. 纠正程序设计师以为加除错码会花太多时间的观念,应该训练程序设计师第一个反应是考虑加上除错码是否有道理,第二是考虑加除错码是否符合项目的目标与工作的优先级。
50. 当某人说“某件事不可能做到”时,他往往是错的。
51. 不要让凡事不能的态度阻碍了创新。
52. 使用者和程序的撰写者一样关心速度和品质的问题。
53. 不要让程序设计师以为使用者并不在乎软件的质量。
54. 不要给使用者次品,宁愿延期交货,务必追求质量完美。
55. 程序设计师必须经常以使用者的观点来看自己写的程序,程序设计师必须能体会使用者的感受。
56. 在包装盒里的每一件东西,都是产品的一部分。
57. 将程序的重用性当作优先考虑的目标之一,否则程序设计师将经常做重复的工作。
58. 充分利用现有资源或创造新资源,以便从每一项工作中获得更大的价值。程序代码的再利用,就是很好的例子,当然,还有其他的地方可以运用“杠杆原理”。
59. 如果您创造了一项资源,并且让别人知道,那么总有一天会派上用场。
60. 从您的每件工作中创造最大的资源,不管是利用现有的杠杆,或是创造新的杠杆。
61. 小心那种“太难了”、“太花时间”或是“太麻烦”的反射性反应。当您遇到别人有这种反应,请先问自己他有没有认真思考过这件事的重要性、以及是否符合项目目标,如果您认为他其实未经深思熟虑,只是直觉的反应,那您就应该把您的想法告诉他,请他重新评估,也许就会有公平的答案。
62. 人们遇到经验范围之外的事情,多少有恐惧感,就会认为“这完全不可能”而强烈反对。试着消除这种习惯性的反应,设法给组员灌输“只要花时间想想看,大部分的事情都做得到”的观念。您不妨以这个问题来对付那种“凡事不能”的态度:“我了解这是做不到的,但是‘如果’做得到,那你会怎么做?”然后您就会发现惊人的转变,您马上就会听到组员七嘴八舌地说应该这样做、那样做,说的是他们刚刚坚持做不到的事情。这个“如果”把他们带离直觉的反应,带到全新的思考模式,这才是他们应该做的。
63. 把使用者当作什么都不懂的外行人,是非常不好的观念。每当您发现有人表露出这种心理,一定要立即纠正,提醒他们使用者才是真正受产品好坏影响最深的人,他们和程序设计师一样关心软件的执行速度和质量。
64. 杠杆原理是您最有用的观念,找到您工作中的杠杆,您可以为小组、项目、公司、甚至软件业创造无可限量的价值。无论如何,尽量利用资源并创造资源,这个原则是绝对错不了的。在您写程序的时候注意程序代码的共享性、训练组员的时候注意到他对公司的价值,即使是像函数命名这种小事,都有杠杆的存在。不管做任何事,都要想到“善用资源”,为未来做好准备。
[八.沉船的感觉]
65. 如果进度发生落后,那表示有个地方出错了。您应该找出问题,并加以解决,不要一味要求组员加班,在问题没有解决之前,加班是没有用的。
66. 别误信加班等于增加生产能力,长期的加班只会伤害生产能力,对项目没有帮助。
67. 周末是属于组员私人的时间,不是公司的。公司不应该以打败竞争对手为理由,要求员工周末加班。
68. 强调思考的重要性,而不是长时间工作。
69. 训练开发小组懂得在正常工作时间内掌握好工作的效率,不要让他们超时工作,因为超时工作只是浪费时间的假面具。
70. 与程序设计师共同研拟出一份每日活动的时间表,把无法预期的临时公务变成固定时间处理的事情,并且把程序开发的工作放在最优先的地位,不要让其他次要的事情干扰到写程序。
71. 经常加班就是项目出问题的明显信号,也许是因为主管的观念错误或是目标不够清楚,不论是什么原因,项目经理绝对不能忽视这种现象,要对这个问题正确处理,项目经理必须协助组员在每周4 0小时的工作时间里,把事情做得更有效率。
72. 我经常听到高层主管称赞组员每天为公司工作很长的时间:“您对公司的贡献值得嘉奖,做得很好!”这绝对是错误的信息,员工应该是因为工作做得好而受到称赞,而不是因为在办公室待得久,管理者不该把“生产效率”和“工作时间”混为一谈,有的人也许可以用更少的时间,完成两倍的工作呢。
73. 为了让组员把办公时间用在正确的地方,并提高部门的工作效率,项目经理不但要为他们排除任何不必要的会议、报告和杂事,还要协助他们好好运用宝贵的上班时间。您应该协助组员安排适当的每日活动表,用一些小技巧,让组员有长段又不受干扰的时间,适合进行开发工作。
74. 如果您关心组员的生活,就不要让他们把全部的时间都投入在工作。每天只要确定他们卖力工作了八小时,就可以把他们赶出办公室了,当然这样做也许会有老板看不顺眼,但是如果您像我一样相信均衡、健康的生活是一切创意的原动力,就坚持这份理念吧!
75. 每周工作4 0小时并不是金科玉律,只不过是美国的传统,而软件开发项目大都以此为前提编定日程表。所以如果一个项目需要程序设计师每周工作40 小时以上才能赶上进度,就表示有问题,也许是日程表定得太乐观,也许是程序设计师需要再训练。不管怎么说,这个问题一定要认真解决,绝对不应该让程序设计师加班来弥补这个漏洞。
2006年6月13日
#
MySQL5支持视图、存储过程、触发器等高级特性了,终于象个完整的数据库了!
很高兴啊,我们做项目的时候选择性更强了。
不过在我一个实际的网站项目中,发现事实和看上去的不太相同啊。是否支持这些特性和支持得多好毕竟是不同的问题!比如在使用Oracle时,发现在9i上能正确执行的统计SQL到8i上居然报错,无非是多用了几个嵌套的子查询。Oracle尚且如此,MySQL也的确不能有太高期望。
下面列举一下MySQL5的问题:
版本5.0.16中对视图进行排序时,会导致服务器崩溃。如:select * from 视图名 order by 某字段。所幸5.0.21版本解决了这个问题。不过我这只是随便一用就能碰上这种致命错误,谁知道还有多少bug隐藏着呢?
存储过程更是不太爽。居然不支持递归,SQLServer和Oracle都早就支持了。郁闷,在处理树形数据时,只能写点固定树的深度的视图了。
1.1.20版本的Query browser和1.1.9版本的Administrator客户端工具稳定性好差,每天能崩个几回。不过功能比以前强些了。Query browser中多粘贴点SQL脚本就能搞死它;CREATE 某东西,按执行多两次、或快了些也能搞死它。只能说比没有强,凑合用吧。
其他基本功能用起来还不错,没碰到什么问题。当然MySQL有如此影响力肯定有他独到之处,对我来说除了免费外就是速度快、用户群大(则技术支持会比较多),否则可以考虑免费的其他数据库,如PostgreSQL,它的客户端工具就专业多了,初步感觉跟SQLServer的差不多了。
2006年6月12日
#
1.历史上出现的编程方法
1)结构化编程
程序应该按自上而下的顺序执行,不会做随便跳转。主要为了提高可读性(特别是控制结构的),可自上而下的阅读代码,并且执行的顺序也大体是这样的。
它的三个组成部分:顺序Sequence,选择selection,循环(或迭代)repetition (or iteration)。任何控制结构都可以用这三个部分组成。
需要小心使用其他方式如:break,continue,return,throw-catch.
2)模块化编程
将逻辑相关的数据和函数放在一个模块中。
VB中的Module就是这个思想的应用。
它没有多个实例的概念,相当于面向对象中的仅包含静态方法和静态变量的类。不需要实例化即可直接调用方法,只存在一个"实例"。
3)面向对象编程
主要特点:封装(Encapsulation),继承(Inheritance),多态(Polymorphism)。
封装:将逻辑相关的数据和方法(函数)放在一个类中。跟模块化编程做的一致。
继承:将内容或接口重用,并实现类型的多态。
多态:不同的语义环境下,同一名称可以有多种不同的实现。
具体表现为两类:
同名方法不同内容,实现方式:使用重载(overload),当然方法的参数是不同的;
同名类型不同内容,实现方式:使用覆盖(override)或实现(implement)。允许使用同一接口调用不同类的的实例对象。
2.各种方法的目标
结构化编程。重点是是控制结构,可看作是基本程序语句(无子程序)的结构;
子程序化编程。似乎没有相关的历史潮流,但我认为加入认为的加入它会使整个方法的发展过程更加完整。也许这个大家都认为是当然的了?子程序(或过程、函数、方法)是模块化、面向对象编程的最重要的基石。
模块化编程。重点是将数据和子程序逻辑相关的组合;
面向对象编程。在模块化的基础上重点加入了模块之间的关系。这里的模块已演化为类。
3.方法体系
上述几种编程方法可以归为一类,属于一个方法体系,其重点在于编程本身,力图有效管理并降低程序逻辑的复杂性。
随其发展,管理的代码单元越来越大,越来越复杂,其方式也越来越接近日常的思维。
其辅助技术或方法有编辑器、调试器、UML、软件工程等。
我认为此体系中新的方法还未出现。现在流行的方法中:AOP面向方面编程,仅是此体系有益的补充;SOA面向服务架构,重点在于用统一的方式调用,而不依赖于底层技术,是组件化的一种形式,这不是这一类的主线方向。
4.总结:
以往的编程方法和原则在现代的方法中得到了保留和发展,这对新手是一个挑战,不循序渐进的学习这些技术,想要短期学会现代方法(如:面向对象编程)是困难的。
记住这些编程方法的主旨是很有好处的。
新的编程方法必将是历史方法的继承和发展,所以学好这些旧的方法非常重要。
掌握这些在各种层出不穷的新语言和新工具中不变的精华,或许,你可以不再那么疲于追赶新的技术潮流。
2006年6月9日
#
老婆的堂弟今年要毕业了,老婆本想给他介绍个工作,就问你想做什么工作?回答是什么赚钱做什么,现在不都这样么?
好熟悉的话!现在社会上的确是这么个风气。回想当初我毕业时,也基本是这么个态度。不过我当时对本专业基本没兴趣,当时本专业工作也难找,在一个中南地区的省会城市工资3、5百。当然也有好点的1千多,不过那是给成绩好的人留的。不是我这种不务正业的主可以触及的。
当初的考虑是基本上要先能养活自己。独立!在我心中是第一位的。上大学时,我就已经耻于每月向我爸要300月生活费了。我的考虑是:
- 干本专业如果有人要我,有个5百块我也就勉为其难的去了。不过由于我不感兴趣也就没有好好学,成绩单上是比较难看的,估计不找点门路也不会有人要。总之想来想去这条路可行性约等于0。
- 那我有什么拿手的?好像还有门手艺,倒是玩了4年吉他,也有不少大学毕业的去酒吧唱歌。不过本人嗓子容易哑,不适于干这个职业。
- 我应该找我喜欢干的,又比较能赚钱的。计算机,就是它了。我十分想当程序员,这个名称对我,那就是一个梦想啊。就跟刚玩计算机时,对“电脑高手”名号之渴望一般。
结果我走了第三条路。不容易啊,其间辛苦和曲折一言难尽。简而言之,就是尝试了考研换行的(考计算机)的路子失败,卖过10台品牌电脑5周后试用期后被开除,两次进过我哥同学的公司干活。成功的是第二次进我哥同学的公司,做ASP+SQLServer开发。
我当时对ASP连听都没听说过。填面试单时,我在期望工资上写的是500,我想基本上能维持大学生活的水平,够自己活下去就行了。面试时,那边就是我哥的同学,他问了些学什么专业之类的问题,我据实以告,他似乎不太满意。看到我的期望工资时,他有些愤怒,说我们这里3000以下的都不要!后来他想了想,给我的500前面加了个"1",因为这个是公司对毕业生的平均水平。
面试完那个狂喜阿,让我下周一去上班。我回家时在路上就暗下决心,一定要好好抓住这个机会!给我一个月的试用期,说一个月后水平可以就留下否则就走人。我的压力很大啊。买本书自己看,项目经理偶尔回来指点一下,前两周我基本上是在公司自学。后来让我做个简单的数据查询页面。搞出来就算通过。
过了好多年了,对那时的心情还是如此清晰。感谢我哥和他的那个同学让我步入了这一行。不容易,不容易。
毕业后的几年,本专业忽然热了起来,一点不比计算机挣得少,但是比干编程的轻松多了。真是30年河东,30年河西!不过我基本上对这个选择没有后悔,因为我当时也不是把赚钱当作唯一的或者第一的目的。主要是因为喜欢。
所以,逢老婆的堂弟即将毕业、找工作之际,说两句心里话,不要把钱看作是好工作标准的全部,钱的多少是可变的。综合考虑行业未来的发展、自身的兴趣等多方面因素,才是比较正确的方法。
Servlet是在多线程环境下的。即可能有多个请求发给一个servelt实例,每个请求是一个线程。
struts下的action也类似,同样在多线程环境下。可以参考struts user guide: http://struts.apache.org/struts-action/userGuide/building_controller.html 中的Action Class Design Guidelines一节: Write code for a multi-threaded environment - Our controller servlet creates only one instance of your Action class, and uses this one instance to service all requests. Thus, you need to write thread-safe Action classes. Follow the same guidelines you would use to write thread-safe Servlets.
译:为多线程环境编写代码。我们的controller servlet指挥创建你的Action 类的一个实例,用此实例来服务所有的请求。因此,你必须编写线程安全的Action类。遵循与写线程安全的servlet同样的方针。
1.什么是线程安全的代码
在多线程环境下能正确执行的代码就是线程安全的。
安全的意思是能正确执行,否则后果是程序执行错误,可能出现各种异常情况。
2.如何编写线程安全的代码
很多书籍里都详细讲解了如何这方面的问题,他们主要讲解的是如何同步线程对共享资源的使用的问题。主要是对synchronized关键字的各种用法,以及锁的概念。
Java1.5中也提供了如读写锁这类的工具类。这些都需要较高的技巧,而且相对难于调试。
但是,线程同步是不得以的方法,是比较复杂的,而且会带来性能的损失。等效的代码中,不需要同步在编写容易度和性能上会更好些。
我这里强调的是什么代码是始终为线程安全的、是不需要同步的。如下:
1)常量始终是线程安全的,因为只存在读操作。
2)对构造器的访问(new 操作)是线程安全的,因为每次都新建一个实例,不会访问共享的资源。
3)最重要的是:局部变量是线程安全的。因为每执行一个方法,都会在独立的空间创建局部变量,它不是共享的资源。局部变量包括方法的参数变量。
struts user guide里有:
Only Use Local Variables - The most important principle that aids in thread-safe coding is to use only local variables, not instance variables , in your Action class.
译:只使用用局部变量。--编写线程安全的代码最重要的原则就是,在Action类中只使用局部变量,不使用实例变量。
总结:
在Java的Web服务器环境下开发,要注意线程安全的问题。最简单的实现方式就是在Servlet和Struts Action里不要使用类变量、实例变量,但可以使用类常量和实例常量。
如果有这些变量,可以将它们转换为方法的参数传入,以消除它们。
注意一个容易混淆的地方:被Servlet或Action调用的类中(如值对象、领域模型类)中是否可以安全的使用实例变量?如果你在每次方法调用时
新建一个对象,再调用它们的方法,则不存在同步问题---因为它们不是多个线程共享的资源,只有共享的资源才需要同步---而Servlet和Action的实例对于多个线程是共享的。
换句话说,Servlet和Action的实例会被多个线程同时调用,而过了这一层,如果在你自己的代码中没有另外启动线程,且每次调用后续业务对象时都是先新建一个实例再调用,则都是线程安全的。