`
ol_beta
  • 浏览: 282496 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

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

    博客分类:
  • java
阅读更多

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

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

有一个生成md5的工具类:

public class MD5 {
    private static long[] state = new long[4];
    private static long[] count = new long[2];
    private static byte[] buffer = new byte[64];
    private static byte[] digest = new byte[16];
    
    private String digestHexStr="";
    public static MD5() {
    }
    //计算MD5
    public static String getMD5ofStr(String inbuf) {
    }
}
 

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

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

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

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

PPS:
这样会好一些:

public final class MD5 {
    private MD5(){}
    //计算MD5
    public static String getMD5ofStr(String inbuf) {
        long[] state = new long[4];
        long[] count = new long[2];
        byte[] buffer = new byte[64];
        byte[] digest = new byte[16];
        String digestHexStr="";
        ........
    }
}
 

 

分享到:
评论

相关推荐

    JDBC线程安全的Druid数据库连接池工具类

    JDBC工具类使用阿里巴巴的数据库连接池Druid,支持高并发,有多线程环境下的事务和查询测试。

    Java并发编程基础.pdf

    并发集合:熟悉Java提供的并发集合类,如ConcurrentHashMap、CopyOnWriteArrayList等,这些集合类在并发环境下提供了线程安全的操作。 线程池:了解Java中的线程池概念,如ExecutorService和ThreadPoolExecutor,...

    java并发编程综合讲解

    您将了解如何在多线程环境下安全地进行数据访问,以及如何避免并发访问所带来的问题。我们将详细介绍 JUC 提供的线程安全集合类,如 ConcurrentHashMap 和 ConcurrentLinkedQueue,以及它们在实际应用中的用法。 ...

    JUC多线程学习个人笔记

    并发集合:JUC提供了一些线程安全的集合类,如ConcurrentHashMap、ConcurrentLinkedQueue等,可以在多线程环境下安全地访问和修改集合。 原子操作:JUC提供了一些原子操作类,如AtomicInteger、AtomicLong等,可以...

    JDBC线程安全的Druid数据库连接类

    JDBC工具类使用阿里巴巴的数据库连接池Druid,支持高并发,支持多线程环境下的事务和查询测试。

    JAVA_API1.6文档(中文)

    java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类...

    强大的扫描工具x-scan

    Q:我看到Scripts目录下有很多nessus的脚本,是否可以自己从nessus的网站上下载最新的plugin, 然后解压到scripts目录中,实现扫描最新漏洞? A:X-Scan移植了nessus的nasl引擎,目前对应于nessus2.2.4,但不包含...

    软件测试经典面试题 (超实用)

    开发及环境搭建类面试题 28 1、描述软件产生内存泄露的原因以及检查方式。(可以结合一种开发语言进行描述) 28 2、简述什么是值传递,什么是地址传递,两者区别是什么? 28 3、结构化程序设计和面向对象程序设计...

    Kali Linux渗透测试(安全牛).txt

    │ 任务134:拒绝服务工具-NMAP、匿名者拒绝服务工具包(匿名者发布的DoS工具)、其他拒绝服务工具-XOIC、HULK、DDOSIM、GoldenEye.mp4 │ ├─第17章 免杀 │ 任务135:恶意软件、防软件、免杀技术、当前现状.mp4 ...

    [Java参考文档].JDK_API 1.6

    java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,...

    Java 1.6 API 中文 New

    java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,...

    java api最新7.0

    java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,...

    jdk1.8及安装教程

    本资源适用于初学者搭建java开发环境。 1.8是一个非常稳定、成熟和广泛使用的版本,它在许多方面都具有优秀的性能和可靠性,并且拥有大量的相关文档和支持资源,是Java开发程序员的使用最广泛的版本之一。 具备以下新...

    JDK_1_6 API

    java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类...

    JavaAPI1.6中文chm文档 part1

    java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类...

    JavaAPI中文chm文档 part2

    java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类...

    [Java参考文档]

    java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类...

    Java典型模块

    26.2.1 FTP服务器操作的工具类 26.2.2 实现文件上传的类 26.2.3 实现文件下载的类 26.3 知识点扩展——FtpClient类的相关知识 26.3.1 实现FTP服务器相关操作类 26.3.2 相关JAR包导入问题 26.4 小结 第27章 Web服务器...

Global site tag (gtag.js) - Google Analytics