1、解决线程安全的主要手段
(1)将对象设计为无状态对象:所谓无状态对象是指对象本身不存储状态信息(对象无成员变量,或者成员变量也是无状态对象),这样多线程并发访问的时候就不会出现状态不一致,Javaweb开发中常用的servlet对象就设计为无状态对象,可以被应用服务器多线程并发调用处理用户请求。不过从面向对象来看,无状态对象是一种不良设计。
(2)使用局部对象:即在方法内部创建对象,这些对象会被进入到该方法的线程创建,除非程序有意识的将这些对象传递给其他线程,否则不会出现对象被多线程并发访问的情形。
(3)并发访问资源时使用锁:即多线程访问资源时候,通过锁的方式时多线程并发操作转化为顺序操作,从而避免资源被并发修改。
2、Hash表冲突解决
Hash表的读写性能在很大程度上依赖HashCode的随机性,即HashCode越随机散列,Hash表的冲突就越少,读写性能就越高,目前较好的字符串Hash散列算法有Time33算法,即对字符串迭代乘以33,求得Hash值,算法原型为:
hash(i) = hash(i-1) *33 + str[i] Time33虽然可以较好的解决冲突,但是有可能相似字符串的HashCode也比较接近,如字符串“AA”的HashCode是2210,字符串“AB”的HashCode是2211.这些在某些应用场景是不能接受的,这种情况下,一个可行的方案是对字符串取信息指纹,再对信息指纹求HashCode,由于字符串微笑的变化就可以引起信息指纹的巨大不同,因此可以获得较好的随机散列。