Base64工具类并发问题!
为减少对象创建次数,一般会做如下编码:
public class EncodeUtils {
private static BASE64Encoder encoder;
private static BASE64Decoder decoder;
public static boolean isNULLorEmpty(String str){
if(str==null||str.trim().equals(""))
return true;
else
return false;
}
/**
*
* 方法名称:encode
* 功能说明:字符串数据进行BASE64加密
* @param str
* @return
*/
public static String encode(String str){
if(encoder == null) encoder = new BASE64Encoder();
return encoder.encode(str.getBytes());
}
/**
*
* 方法名称:decode
* 功能说明:字符串数据进行BASE64解密
* @param str
* @return
* @throws IOException
*/
public static String decode(String str) throws IOException {
if(decoder==null) decoder = new BASE64Decoder();
return new String(decoder.decodeBuffer(str));
}
}
这样写,看似没问题,但是在高并发下会存在问题,同一字符串解码出来的信息不一致,BASE64Encoder、BASE64Decoder 不是线程安全的类
所以可以按如下修改,有两种方案,一种是每次都重新创建个对象,另外一种是替换jra包,不用jre带的,用org.apache.commons.codec下的base64,这个是线程安全的类
修改如下:
/**
*
* 方法名称:decode
* 功能说明:字符串数据进行BASE64解密
* @param str
* @return
* @throws IOException
*/
public static String decode(String str) throws IOException {
return new String(new BASE64Decoder().decodeBuffer(str));
}
或者换jar包
public class EncodeUtils {
private static Base64 base64 = new Base64();
/**
*
* 方法名称:decode
* 功能说明:字符串数据进行BASE64解密
* @param str
* @return
* @throws IOException
*/
public static String decode(String str) throws IOException {
return new String (base64.decode(str));
}
}
Base64工具类并发问题!的更多相关文章
- Base64工具类
public final class AbBase64 { /** The Constant base64EncodeChars. */ private static final char[] bas ...
- 【重学Java】多线程进阶(线程池、原子性、并发工具类)
线程池 线程状态介绍 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态.线程对象在不同的时期有不同的状态.那么Java中的线程存在哪几种状态呢?Java中的线程 状态被定 ...
- Java开发工具类集合
Java开发工具类集合 01.MD5加密工具类 import java.security.MessageDigest; import java.security.NoSuchAlgorithmExce ...
- 并发工具类:CountDownLatch、CyclicBarrier、Semaphore
在多线程的场景下,有些并发流程需要人为来控制,在JDK的并发包里提供了几个并发工具类:CountDownLatch.CyclicBarrier.Semaphore. 一.CountDownLatch ...
- 线程高级应用-心得6-java5线程并发库中同步工具类(synchronizers),新知识大用途
1.新知识普及 2. Semaphore工具类的使用案例 package com.java5.thread.newSkill; import java.util.concurrent.Executor ...
- ios Base64编解码工具类及使用
为了避免明码传递http内容,可以用base64编码后传输,收到方再解码,也方便了2进制数据的字符串式传输. 对于ios来说,google给提供了一个很好的工具类,方便进行base64编解码,当然也可 ...
- JUC学习笔记--JUC中并发工具类
JUC中并发工具类 CountDownLatch CountDownLatch是我目前使用比较多的类,CountDownLatch初始化时会给定一个计数,然后每次调用countDown() 计数减1, ...
- java 并发工具类CountDownLatch & CyclicBarrier
一起在java1.5被引入的并发工具类还有CountDownLatch.CyclicBarrier.Semaphore.ConcurrentHashMap和BlockingQueue,它们都存在于ja ...
- Java并发工具类 - CountDownLatch
Java并发工具类 - CountDownLatch 1.简介 CountDownLatch是Java1.5之后引入的Java并发工具类,放在java.util.concurrent包下面 http: ...
随机推荐
- sql server 函数详解(3)数据类型转换函数和文本图像函数
数据类型转换函数 文本和图像函数 --在同时处理不同数据类型的值时,SQL Server一般会自动进行隐士类型转换.对于数据类型相近的值是有效的,比如int和float,但是对于其它数据类型,例如整型 ...
- SourceTree报错
1.SourceTree 拉取报错 Your local changes to the following files would be overwritten by merge:XXX 原因: 本 ...
- Delphi 常量
- JDK12的安装搭建
JDK12的安装搭建 一.JDK下载 1.JDK官网下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk12-down ...
- 解读sam格式文件
1,SAM文件格式介绍 SAM(The Sequence Alignment / Map format)格式,即序列比对文件的格式,详细介绍文档:http://samtools.github.io/h ...
- JS 循环遍历 总结
一.循环遍历语句 for...in... (ES5) 语法:javascript for(keys in obj){} 适用:遍历对象 说明: 1.keys表示obj对象的每一个键值对的键(键名),所 ...
- Ubuntu利用ROS搭建手机移动网络摄像头(Android)
所需设备 PC -> Ubuntu 16.04 - > ROS Kinetic Android系统手机 1.Android移动端APP下载安装 配置手机端:(一般默认即可RTSP) 2.源 ...
- Java基本的程序结构设计 字符类型
char类型 char是2个字节,和short一样. char用单引号来表示. char可以通过数字来表示,也可以通过字母来表示,也可以通过unicode编码单元来表示,特殊字符还可以通过\+字符来表 ...
- 【BZOJ1999】树网的核
题目大意:题目过长,无法简单描述... 题解: 由于树网的核一定是树直径的一段,因此考虑先将直径取出,通过两次 BFS 即可.要求的东西是树上任意一点到这条取出的线段的距离的最大值,发现这个最大值有可 ...
- [bzoj4358]permu:莫队+线段树/回滚莫队
这道题是几天前水过去的,现在快没印象了,水一发. 首先我们看到它让求解的是最长的值域 连续段长度,很好. 然后就想到了山海经,但但是我还没有做. 然后又想到了很久以前的一次考试的T3旅馆hotel(我 ...