由于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存放计算的结果。在多线程并发访问的情况下,这些变量是会被“共享”的,所以会导致计算结果不准确甚至出现异常。
有三种比较简单的方法可以解决:
- getMD5ofStr方法变成非static的普通方法,这样每次调用这个方法都必须new一个新的MD5对象。
- getMD5ofStr方法变成同步方法(同步代码块,显示锁,synchronized method都可以)。
- 将被“共享”的变量放到方法getMD5ofStr里面,不设置成员变量。
考虑到现在系统有些地方已经开始使用这个工具类了,不便改动结构,先采用第二种快速修复bug,然后腾出时间用第三种发放重构。
PS:
- 工具类能否设计成单例?如果能最好。单例能减少创建类和分配内存的开销,减少垃圾回收次数。
- 工具类能否设计成不变类?如果能最好,不变类天生线程安全!
- 在并发环境下,工具类能不能不用同步?不管怎么说,同步都是要有一些开销的。
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="";
........
}
}
分享到:
相关推荐
Java并发工具类是Java平台提供的一系列用于处理多线程并发问题的类和接口,它们在`java.util.concurrent`包中。并发问题主要包括资源竞争、死锁、活锁以及饥饿等,合理使用并发工具可以有效地提高程序的并发性能并...
这些类提供了原子操作,如incrementAndGet(),decrementAndGet(),compareAndSet()等,用于在高并发环境下更新变量。 五、同步器 Java并发工具包中包含了一些同步辅助类,如Semaphore(信号量)、CyclicBarrier...
内网并发测试工具是针对网络服务接口进行性能和稳定性测试的重要软件,特别是在内网环境中的应用,它能够帮助开发者和测试工程师模拟大量并发用户请求,以此来检验系统在高负载情况下的表现。这类工具通常包括多种...
在实际开发中,这些工具类往往被设计成线程安全的,以便在多线程环境下使用。因此,理解并发编程的概念,如同步机制(synchronized关键字、Lock接口)、线程池等也是很重要的。 此外,对于描述中的“挺强大”,这...
这些集合在内部实现了线程安全,确保了在并发环境下的正确性。 6. **线程信号(Thread Signaling)**:`ManualResetEvent`、`AutoResetEvent`、`Mutex`和`Semaphore`等工具可以帮助线程之间进行通信,控制执行流程...
5. **线程安全**:考虑到多线程环境,工具类中的方法需要考虑线程安全问题。如果方法涉及共享状态,那么它们需要被设计为线程安全的,或者通过同步机制来保证并发访问的正确性。 6. **异常处理**:为了提供良好的...
以上就是Java并发工具包中的一些核心概念和类,熟练掌握这些工具,可以帮助我们编写出更加高效、可靠的并发程序。通过阅读和学习博客文章《Java并发工具包》(链接:https://bijian1013.iteye.com/blog/2258379),...
在Java中,线程管理工具类可以帮助我们更方便地处理这些任务,避免复杂的并发问题。"线程管理工具类"如题目所示,是一种设计用于简化线程操作的类,它可能包含了实现特定策略来优化线程使用的方法。 标题中的“线程...
8. **并发异常处理**:在并发环境下,异常处理变得更为复杂,书中有专门章节讲解如何正确捕获和处理线程间的异常。 9. **线程通信**:`wait()`, `notify()`和`notifyAll()`方法是Java中基本的线程通信手段,书中会...
5. **性能考虑**:在高并发环境下,订单号生成工具需要快速且高效,避免成为系统的瓶颈。可以使用缓存策略预先生成一部分订单号,或者设计高性能的分布式生成服务。 6. **扩展性**:随着业务的发展,可能需要支持更...
在IT行业中,数据库工具类是开发人员日常工作中不可或缺的一部分,它们极大地简化了数据操作和管理。这个主题"各种数据库工具类"涵盖了多个方面,包括但不限于数据库连接、查询、事务处理、数据迁移等。下面我们将...
这些容器类在设计上充分考虑了并发环境下的操作效率,提供了比传统集合类更好的并发性能。 5. 线程池:线程池是J.U.C中的重要组成部分,它通过预先创建并缓存一定数量的线程,来避免频繁创建和销毁线程所带来的性能...
本篇文章将深入讲解一个名为"封装Zip相关的工具类"的实用代码库,它简化了在C#环境中对Zip文件的操作。 这个工具类的核心目标是提供压缩和解压文件的功能,同时易于集成到项目中,通过创建一个本地的NuGet库,使得...
总的来说,这个数据库工具类利用DBCP连接池管理数据库连接,采用懒汉单例模式确保在需要时才创建连接,并通过线程绑定策略提高多线程环境下的安全性与效率。开发者可以通过配置`jdbc.properties`文件调整数据库连接...
"C# .Net通用工具类"是一个集合了各种实用功能的代码库,它旨在简化常见的编程任务,提高开发效率。这个工具类集合可能是由开发者们在实际项目中提炼和优化的代码片段组成,便于其他开发者在自己的项目中直接引用和...
下面我们将深入探讨Java工具类的相关知识点。 1. **Java集合框架工具类**: - `java.util.Collections`:提供对集合的通用操作,如排序、查找、填充等。 - `java.util.Arrays`:用于操作数组,包括排序、复制、...
这个工具类采用了设计模式中的单例模式来确保在整个应用程序中只有一个数据库连接实例,从而优化资源使用并避免并发问题。 首先,我们来看`mysqlUtil.php`,这个文件很可能包含了我们的MySQL工具类。在PHP中,一个...
在多线程环境中,数据库工具类必须是线程安全的,这意味着它的实例可以在多个线程中并发使用而不会出现问题。通常,工具类会使用静态单例模式来保证这一点。 八、批处理操作 对于大量相同类型的数据库操作,批处理...
这个“Java Https工具类,Java Https Post请求”可能是一个自定义的类,用于简化发送HTTPS POST请求的过程。以下是对这个主题的详细讲解: 1. **HTTPS基础**: - HTTPS是在HTTP上添加了SSL/TLS(Secure Sockets ...
这些工具类通常包含了各种实用方法,可以处理字符串、集合、日期时间、数学计算等常见任务。以下是一些Java中常见的工具类及其相关知识点: 1. **`java.util.Arrays`**:这个工具类提供了一系列静态方法来操作数组...