并发环境下,我们的工具类是否安全?_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 并发环境下,我们的工具类是否安全?

并发环境下,我们的工具类是否安全?

 2011/10/6 8:11:49  ol_beta  http://softbeta.iteye.com  我要评论(0)
  • 摘要:由于web天生并发性,导致我们的一般java工具类会在这样的环境下出现问题。其实问题的根源就是我们的工具类不是线程安全的。有一个生成md5的工具类:publicclassMD5{privatestaticlong[]state=newlong[4];privatestaticlong[]count=newlong[2];privatestaticbyte[]buffer=newbyte[64];privatestaticbyte[]digest=newbyte[16]
  • 标签:工具 我们

由于web天生并发性,导致我们的一般java工具类会在这样的环境下出现问题。

其实问题的根源就是我们的工具类不是线程安全的。

有一个生成md5的工具类:monospace;">



变量state, count ,buffer ,digest 算法中用到的核心数据,digestHexStr存放计算的结果。在多线程并发访问的情况下,这些变量是会被“共享”的,所以会导致计算结果不准确甚至出现异常
有三种比较简单的方法可以解决:

  1. getMD5ofStr方法变成非static的普通方法,这样每次调用这个方法都必须new一个新的MD5对象。
  2. getMD5ofStr方法变成同步方法(同步代码块,显示锁,synchronized method都可以)。
  3. 将被“共享”的变量放到方法getMD5ofStr里面,不设置成员变量。

考虑到现在系统有些地方已经开始使用这个工具类了,不便改动结构,先采用第二种快速修复bug,然后腾出时间用第三种发放重构。
PS:

  1. 工具类能否设计成单例?如果能最好。单例能减少创建类和分配内存的开销,减少垃圾回收次数。
  2. 工具类能否设计成不变类?如果能最好,不变类天生线程安全
  3. 在并发环境下,工具类能不能不用同步?不管怎么说,同步都是要有一些开销的。

PPS:
这样会好一些:



?

发表评论
用户名: 匿名