package efficient_lock;import java.util.Random;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;public class ThreadLocalRandom {public static final int GEN_COUNT = 10000000;public static final int THREAD_COUNT = 4;static ExecutorService es = Executors.newFixedThreadPool(THREAD_COUNT);// 多个线程共享一个Randompublic static Random rnd = new Random(123);// 多个线程各分配一个Randompublic static ThreadLocal<Random> tRnd = new ThreadLocal<Random>() {protected Random initialValue() {return new Random(123);};};public static void main(String[] args) throws InterruptedException, ExecutionException {Future[] futs = new Future[THREAD_COUNT];for (int i = 0; i < THREAD_COUNT; i++) {futs[i] = es.submit(new RndTask(0));}long totalTime = 0;for (int i = 0; i < THREAD_COUNT; i++) {totalTime += (long) futs[i].get();}System.out.println("多个线程访问同一个Random实例:" + totalTime + "ms");// ThreadLocal的情况for (int i = 0; i < THREAD_COUNT; i++) {futs[i] = es.submit(new RndTask(1));}totalTime = 0;for (int i = 0; i < THREAD_COUNT; i++) {totalTime += (long) futs[i].get();}System.out.println("使用ThreadLocal包装Random实例:" + totalTime + "ms");es.shutdown();}public static class RndTask implements Callable<Long> {private int mode;public RndTask(int mode) {super();this.mode = mode;}public Random getRandom() {if (mode == 1) {return tRnd.get();} else if (mode == 0) {return rnd;} else {return null;}}@Overridepublic 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;}}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。