JDK1.5后的实用新用法

来源:互联网 发布:php ddos攻击 编辑:程序博客网 时间:2024/05/18 03:19

 个人理解,若有不妥,请指正

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来填充不必要的参数传递了。