随机数生成是一个非常常见的操作,而且 Java
也提供了 java.util.Random
类用于生成随机数,而且呢,这个类也是线程安全的,就是有一点不好,在高并发下,它的性能不佳。
一、背景
为什么高并发下, Random
的性能不佳?
因为它共享一个Random
实例。这样就会导致多个线程争用。
为了解决这个问题,Java 7
引入了 java.util.concurrent.ThreadLocalRandom
类,用于在多线程环境中生成随机数。
二、ThreadLocalRandom
使用方法
@Test
public void random() {
ThreadLocalRandom random = ThreadLocalRandom.current();
Integer num = random.nextInt(10);
System.out.println(num);
}复制
附一个随机字符串工具类
public class StrRandomUtil {
/**
* 全部字符字典
*/
public static final String allChar = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
/**
* 纯字母字典
*/
public static final String letterChar = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
/**
* 纯数字字典
*/
public static final String numberChar = "0123456789";
/**
* 生成包含大、小写字母、数字的随机字符串
* @param length 字符串长度
* @return
*/
public static String genStr(int length) {
StringBuffer sb = new StringBuffer();
ThreadLocalRandom random = ThreadLocalRandom.current();
for (int i = 0; i < length; i++) {
sb.append(allChar.charAt(random.nextInt(allChar.length())));
}
return sb.toString();
}
/**
* 生成纯数字字符串
* @param length
* @return
*/
public static String genDigitalStr(int length) {
StringBuffer sb = new StringBuffer();
ThreadLocalRandom random = ThreadLocalRandom.current();
for (int i = 0; i < length; i++) {
sb.append(numberChar.charAt(random.nextInt(numberChar.length())));
}
return sb.toString();
}
/**
* 生成只包含大小写字母的字符串
* @param length
* @return
*/
public static String genLetterStr(int length) {
StringBuffer sb = new StringBuffer();
ThreadLocalRandom random = ThreadLocalRandom.current();
for (int i = 0; i < length; i++) {
sb.append(letterChar.charAt(random.nextInt(letterChar.length())));
}
return sb.toString();
}
/**
* 生成只包含小写字母的字符串
* @param length
* @return
*/
public static String genLowerStr(int length) {
return genLetterStr(length).toLowerCase();
}
/**
* 生成只包含大写字母的字符串
* @param length
* @return
*/
public static String genUpperStr(int length) {
return genLetterStr(length).toUpperCase();
}
/**
* 生成纯0字符串
* @param length
* @return
*/
public static String genZeroStr(int length) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
sb.append('0');
}
return sb.toString();
}
/**
* 把数字转成字符串,长度不够前面补0
* @param num
* @param strLength
* @return
*/
public static String genStrWithZero(int num, int strLength) {
StringBuffer sb = new StringBuffer();
String strNum = String.valueOf(num);
if (strLength - strNum.length() >= 0) {
sb.append(genZeroStr(strLength - strNum.length()));
} else {
throw new RuntimeException("将数字" + num + "转化为长度为" + strLength + "的字符串异常!");
}
sb.append(strNum);
return sb.toString();
}
}复制
文章转载自风尘博客,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。