其他
别用 Random了,试试 ThreadLocalRandom,好用!
前言
Random 的性能问题
ThreadLocalRandom
UNSAFE.putLong(t = Thread.currentThread(), SEED, r = UNSAFE.getLong(t, SEED) + GAMMA);
Thread t = Thread.currentThread();
long r = UNSAFE.getLong(t, SEED) + GAMMA;
UNSAFE.putLong(t, SEED, r);
Unsafe
功能
public native long getLong(Object var1, long var2);
public native void putLong(Object var1, long var2, long var4);
putLong(object, offset, value) 可以将 object 对象内存地址偏移 offset 后的位置后四个字节设置为 value。 getLong(object, offset) 会从 object 对象内存地址偏移 offset 后的位置读取四个字节作为 long 型返回。
不安全性
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
// Unsafe 设置了构造方法私有,getUnsafe 获取实例方法包私有,在包外只能通过反射获取
Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
Unsafe unsafe = (Unsafe) field.get(null);
// Test 类是一个随手写的测试类,只有一个 String 类型的测试类
Test test = new Test();
test.ttt = "12345";
unsafe.putLong(test, 12L, 2333L);
System.out.println(test.value);
}
ThreadLocalRandom 的实现
疑问
使用场景
https://stackoverflow.com/questions/40620026/why-is-threadlocalrandom-implemented-so-bizarrely
内存布局
小结
往期推荐
耗时数月整理出来的技术书籍免费分享给大家扫描下方二维码,回复关键字【电子书】获取!
↘↘↘