为减少对象创建次数,一般会做如下编码:

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工具类并发问题!的更多相关文章

  1. Base64工具类

    public final class AbBase64 { /** The Constant base64EncodeChars. */ private static final char[] bas ...

  2. 【重学Java】多线程进阶(线程池、原子性、并发工具类)

    线程池 线程状态介绍 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态.线程对象在不同的时期有不同的状态.那么Java中的线程存在哪几种状态呢?Java中的线程 状态被定 ...

  3. Java开发工具类集合

    Java开发工具类集合 01.MD5加密工具类 import java.security.MessageDigest; import java.security.NoSuchAlgorithmExce ...

  4. 并发工具类:CountDownLatch、CyclicBarrier、Semaphore

    在多线程的场景下,有些并发流程需要人为来控制,在JDK的并发包里提供了几个并发工具类:CountDownLatch.CyclicBarrier.Semaphore. 一.CountDownLatch ...

  5. 线程高级应用-心得6-java5线程并发库中同步工具类(synchronizers),新知识大用途

    1.新知识普及 2. Semaphore工具类的使用案例 package com.java5.thread.newSkill; import java.util.concurrent.Executor ...

  6. ios Base64编解码工具类及使用

    为了避免明码传递http内容,可以用base64编码后传输,收到方再解码,也方便了2进制数据的字符串式传输. 对于ios来说,google给提供了一个很好的工具类,方便进行base64编解码,当然也可 ...

  7. JUC学习笔记--JUC中并发工具类

    JUC中并发工具类 CountDownLatch CountDownLatch是我目前使用比较多的类,CountDownLatch初始化时会给定一个计数,然后每次调用countDown() 计数减1, ...

  8. java 并发工具类CountDownLatch & CyclicBarrier

    一起在java1.5被引入的并发工具类还有CountDownLatch.CyclicBarrier.Semaphore.ConcurrentHashMap和BlockingQueue,它们都存在于ja ...

  9. Java并发工具类 - CountDownLatch

    Java并发工具类 - CountDownLatch 1.简介 CountDownLatch是Java1.5之后引入的Java并发工具类,放在java.util.concurrent包下面 http: ...

随机推荐

  1. type=file 上传图片限制 类型和尺寸 方法

    <form> <input type="file" name="pic" id="pic" accept="im ...

  2. init_module - 初始化一条可加载模块的记录.

    总览 #include <linux/module.h> int init_module(const char *name, struct module *image); 描述 init_ ...

  3. 微软撤出 Windows断供华为!

    华为被美国列入“实体名单”后,从硬件到软件再到技术标准,华为对外联系纷纷被掐断,其中软件系统方面,Google安卓系统已经停止与华为合作,Mate 20 Pro也被从安卓Q 10.0的尝鲜名单中移除. ...

  4. python-装饰器2

    python-装饰器2 1.函数既“变量 def bar(): print("in the bar") def foo(): print("in the foo" ...

  5. windows核心编程01_错误处理

    windows函数调用出错时,可以通过方法去查询出错根源在哪里. #include <Windows.h> #include <iostream> using namespac ...

  6. C/C++ 零碎知识点

    传递参数的一般指导原则: 对于使用传递的值而不做修改的函数: 如果数据对象很小,比如内置类型或者小型结构,按值传递. 如果数据对象是数组,只能使用指针,并将指针生命为指向const的指针. 如果数据对 ...

  7. Linux-定时任务排查

    前段时间,哥们的服务器被人反弹了shell,由于反弹的地址不可达,系统总是会发送一条mail邮件到root账户,导致入侵行为被发现,由于反弹的动作是通过crontab来定时执行的,所以来梳理下cron ...

  8. 009-saltstack之salt-ssh的使用及配置管理LAMP状态的实现

    1.salt-ssh的使用 官方文档:https://docs.saltstack.com/en/2016.11/topics/ssh/index.html (1)安装salt-ssh [root@l ...

  9. 020-zabbix修改主机名为中文名

    我这边zabbix版本有2.4和3的都有. 要让zabbix主机名支持中文,,需要修改zabbix的php代码文件,如下图修改完中文主机名是不支持的: 实现步骤: 进到zabbix web目录,一般在 ...

  10. Tomb Raider HihoCoder - 1829 (二进制枚举+暴力)(The 2018 ACM-ICPC Asia Beijing First Round Online Contest)

    Lara Croft, the fiercely independent daughter of a missing adventurer, must push herself beyond her ...