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删除重复行和删除字段首位
			删除重复行 user_info: -- 单字段筛选重复行 SELECT *from user_info WHERE NAME in ( SELECT NAME from user_info GROUP ... 
- 关于KMeans和range的使用
			#!/usr/bin/python#-*-coding:utf-8-*-import numpy as npfrom sklearn.cluster import KMeansfrom scipy.s ... 
- Xadmin
			一.安装 Xadmin pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2 二.导出文件 在公司开发中如何知道项目里别 ... 
- 生产服务器上安装Python
			2018-05-17 生产环境的服务器(以下简称内网服务器)由于安全限制,可能无法连接外网.这种情况下将无法直接使用pip命令安装python的包 一.更改pip源 - 默认pip是使用Python官 ... 
- matlab 正弦信号产生
			fs=2400;%设定采样频率N=1000; %采样的点数n=0:N-1;t=n/fs; %1/fs相当于隔多长时间才一个点f1=50;%设定争先信号频率xn=sin(2*pi*f1*t);figur ... 
- vue项目中利用popstate处理页面返回操作
			需求背景:项目中需要做一个返回确认,避免用户误触返回键而退出当前页面. 原理:利用history和浏览器刷新popstate状态 实现: 1.在mounted() 阶段判断并添加popstate事件监 ... 
- [每日一学]apache camel简介
			apache camel 是轻量级esb框架.如下是它的架构图: 它有几个比较重要的概念就是: 1.endpoint,所谓的endpoint,就是一种可以接收或发送数据的组件.可以支持多种协议,如jm ... 
- Angular7和PrimeNg集成
			常规操作之后,随便加了一个控件发现报错了.错误信息看起来是不能识别PrimeNg的组件,经过一番折腾发现.因为用到了ngModel,需要导入FormsModule.因为新建的工程没有导入,导入之后就好 ... 
- DECLARE_GLOBAL_DATA_PTR
			DECLARE_GLOBAL_DATA_PTR在arch/arm/include/asm/global_data.h中定义 #include <asm-generic/global_data.h ... 
- left semi join VS left join
			left semi join VS left join思考: 建表 CREATE TABLE `kv1`( `k1` string, `v1` string) ROW FORMAT SERDE 'or ... 
