个人理解,若有不妥,请指正
1.使用StringBuilder来代替StringBuffer
StringBuilder和StringBuffer的主要区别是一个非线程安全,一个线程安全(方法前多加了synchronized关键字,所以性能相比有些降低).
关于线程安全的个人理解是在多线程环境下,能够恰当的处理共享资源(或者叫临界资源),让程序正常运行达到预期行为的是线程安全,反之为非线程安全.
共享资源是被多个线程访问并且可能被修改的类变量或者实例变量,局部变量和方法参数变量不是共享资源.
如传统的java servlet(单实例多线程,对每个浏览器请求servlet会启动一个线程)的实例变量或类变量就属于共享资源,在处理共享资源时必须考虑有可能同时被多个线程修改.
java中引入了synchronized机制,以保证同一时刻只有一个线程处理共享资源.这样数据的内容顺序和多个线程的处理顺序是一致的,也就是说是线程安全的.
基于此我们会发现Web开发中大部分情形下是可以使用StringBuilder来代替jdk1.4前的StringBuffer的.
在使用Struts2时,Struts2会为每个请求生成一个新的实例(多实例单线程),这个时候不存在可能被多个线程访问的共享资源,不用考虑线程安全性。所以一般说Struts2是线程安全的.
Struts1是非线程安全的,需要考虑多个线程读写共享资源情形.
ArrayList和Vector,HashMap和Hashtable情形与StringBuilder和StringBuffer类似.
为了保证线程安全,还可以选择另一种替代方案 ThreadLocal
ThreadLocal为每个线程生成一个资源的副本,避免了同步开销以及死锁的产生,
线程间彼此操作自己的资源,互不影响.
2.使用动态参数特性
题外:java中参数传递是值传递,不是引用传递(详见core java)
比如这样定义一个方法:根据参数个数给PreparedStatement设值
我们可以这样调用这个方法:
是不是很方便呢?在没有出现这个新特性之前,我们可能只能用null来填充不必要的参数传递了。