双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

使用多线程同时访问同一个Random实例发现的耗时问题,求解答

Ethan9987 Ethan9987 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
本人半小白。在学习《实战Java高并发程序设计》这本书时,跟着书写了一个例子,以下是代码。
在执行 代码 49~56行时,每个线程的执行时间在3000ms+,总执行时间 10000ms左右。
本着简化代码的强迫症,把代码改成77~80行这个样子,但是每个线程执行时间变成了100ms左右,总执行时间400ms+。请问这是由于什么原因造成的呢?是简写的代码有问题吗?还是jdk(8)有相关优化?求赐教谢谢

public class RandomTimeTest {
// 要产生的随机数数量
public static final int GEN_COUNT = 10000000;
// 参与工作的线程数量
public static final int THREAD_COUNT = 4;
// 定义线程池
static ExecutorService exe = Executors.newFixedThreadPool(THREAD_COUNT);

public static Random rnd = new Random(123);
public static ThreadLocalRandom tlRnd = ThreadLocalRandom.current();

// 由ThreadLocal封装的Random
public static ThreadLocal<Random> tRnd = ThreadLocal.withInitial(() -> new Random(123));

public static class RndTask implements Callable<Long> {
private int mode = 0;

public RndTask(int mode) {
this.mode = mode;
}

// 创建随机数的方式
public Random getRandom() {
if (mode == 0)
return rnd;
else if (mode == 1)
return tRnd.get();
else if (mode == 2)
return tlRnd;
else
return null;
}

/**
* 每个线程产生若干随机数,完成工作后记录幷返回所消耗的时间
*/
@Override
public Long call() throws Exception {
long b = System.currentTimeMillis();
for (int i = 0; i < GEN_COUNT; i++)
getRandom().nextInt();
long e = System.currentTimeMillis();
System.out.println(Thread.currentThread().getName()+ " spend " + (e - b) + "ms");
return e - b;
}
}

public static void main(String[] args) throws ExecutionException, InterruptedException {
Future<Long>[] futures = new Future[THREAD_COUNT];
// 多线程共享Random实例
for (int i = 0; i < THREAD_COUNT; i++)
futures[i] = exe.submit(new RndTask(0));
long totaltime = 0;
for (int i = 0; i < THREAD_COUNT; i++)
totaltime += futures[i].get();
System.out.println("多线程同时访问同一个Random实例:" + totaltime + "ms");


// 使用ThreadLocal情况
for (int i = 0; i < THREAD_COUNT; i++)
futures[i] = exe.submit(new RndTask(1));
totaltime = 0;
for (int i = 0; i < THREAD_COUNT; i++)
totaltime += futures[i].get();
System.out.println("使用ThreadLocal包装Random实例: " + totaltime + "ms");

// 使用ThreadLocalRandom情况
for (int i = 0; i < THREAD_COUNT; i++)
futures[i] = exe.submit(new RndTask(2));
totaltime = 0;
for (int i = 0; i < THREAD_COUNT; i++)
totaltime += futures[i].get();
System.out.println("使用ThreadLocalRandom实例: " + totaltime + "ms");
exe.shutdown();


/*long totaltime = 0;
for (int i = 0; i < THREAD_COUNT; i++)
totaltime += exe.submit(new RndTask(0)).get();
System.out.println("多线程同时访问同一个Random实例:" + totaltime + "ms");

totaltime = 0;
for (int i = 0; i < THREAD_COUNT; i++)
totaltime += exe.submit(new RndTask(1)).get();
System.out.println("使用ThreadLocal包装Random实例:" + totaltime + "ms");

totaltime = 0;
for (int i = 0; i < THREAD_COUNT; i++)
totaltime += exe.submit(new RndTask(2)).get();
System.out.println("使用ThreadLocalRandom实例:" + totaltime + "ms");
exe.shutdown();*/
}
}
...全文

相关推荐

np.random.seed() 的使用详解

在Python的科学计算库NumPy中,`np.random.seed()`是一个非常重要的函数,它用于设置随机数生成器的初始状态,以便在多次运行程序时能够复现相同的随机数序列。这个函数广泛应用于人工

weixin_38722193

概率 随机变量 随机过程习题解答(第4版)

国外经典随机过程教材Probability_Random_Variables_and_Stochastic_Process_4th,概率 随机变量 随机过程(第四版)习题解答,对深入学习随机过程,特别

zangwill

Probability, Random Variables and Stochastic Processes 4ed 习题答案

这本教材不仅为学生提供了丰富的理论知识,还通过习题解答帮助他们巩固所学,并培养解决问题的能力。同时,该教材也强调了版权保护的重要性,确保了教育资源的合理使用。

raveneternity

python题目求解答

通过这种方式导入可以直接访问`pyfun`函数。- **D.** 正确。这种方式也是正确的,首先导入包`pypack`,然后导入`pymod`模块,最后调用`pyfun`函数。

Beena Woo

基于YOLOv8的交通违法车窗抛物抓拍系统详解与实战

目标检测是计算机视觉领域的核心任务之一,YOLOv8作为当前广泛应用的单阶段检测算法,凭借高效的网络结构和便捷的部署能力,成为工程落地的热门选择。在智能交通场景中,如何从监控视频中精准识别车窗抛物这类动态小目标,是实际应用中的典型难题。通过构建包含物体与车窗区域标注的数据集,结合PyQt5可视化界面与多线程推理逻辑,将检测结果转化为行为判定,实现了从模型训练到系统集成的完整闭环。本文围绕YOLOv8的模型选型、数据集标注、训练调参、界面实现及部署优化展开,为相关毕设项目与二次开发提供实操参考。

weixin_34343000
评论 6
收藏 已收藏
分享
返回顶部
Ethan9987
Java SE 62,621 成员 307,251 内容