Prefer ThreadLocalRandom over Random

 

Java 7 has introduced a new random number generator - ThreadLocalRandom

Normally to generate Random numbers, we either do

However in a concurrent applications usage of above leads to contention issues -

  • Random is thread safe for use by multiple threads. But if multiple threads use the same instance of Random, the same seed is shared by multiple threads. It leads to contention between multiple threads and so to performance degradation. 

ThreadLocalRandom is solution to above problem. ThreadLocalRandom has a Random instance per thread and safeguards against contention.

 

From the api docs - 

Usages of this class should typically be of the form: ThreadLocalRandom.current().nextX(...) (where X is IntLong, etc). When all usages are of this form, it is never possible to accidently share a ThreadLocalRandom across multiple threads.

Usage Example - 

 

//Generate a random number b/w 0 and 10.  0 <= R < 10
//Using Math.random()
int r1 = (int)Math.random()*10;
//Using Random
Random rand = new Random();
int r2 = rand.nextInt(10);
//Using ThreadLocalRandom
int r3 = ThreadLocalRandom.current().nextInt(10);

 http://thoughtfuljava.blogspot.com/2012/09/prefer-threadlocalrandom-over-random.html

http://www.blogjava.net/yongboy/archive/2012/02/04/369574.html

    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        for (int i = 0; i < 10000; i++) {
            int nextInt = ThreadLocalRandom.current().nextInt(10);
            if (nextInt >= 0) {
                String positive = "positive";
                Integer current = map.get(positive);
                map.put(positive, current == null ? 1 : ++current);
            } else {
                System.out.println(nextInt);
                String positive = "negative";
                Integer current = map.get(positive);
                map.put(positive, current == null ? 1 : ++current);
            }
        }
        System.out.println(map);

    }

 

时间: 2024-10-21 15:28:25

Prefer ThreadLocalRandom over Random的相关文章

解密随机数生成器(二)——从java源码看线性同余算法

Random Java中的Random类生成的是伪随机数,使用的是48-bit的种子,然后调用一个linear congruential formula线性同余方程(Donald Knuth的编程艺术的3.2.1节) 如果两个Random实例使用相同的种子,并且调用同样的函数,那么生成的sequence是相同的 也可以调用Math.random()生成随机数 Random实例是线程安全的,但是并发使用Random实例会影响效率,可以考虑使用java.util.concurrent.ThreadL

多线程-我这样是否对同一个对象进行了排序(小猿一只,评论勿留情)

问题描述 我这样是否对同一个对象进行了排序(小猿一只,评论勿留情) import java.util.Random; public class MergeSort implements Runnable{ public void run() { int[] a = new int[100000]; Random p = new Random(); //产生随机数 for(int i=0;i<100000;i++) a[i] = p.nextInt(10000); //计时 //long star

Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom

文中的 Random即:java.util.Random, ThreadLocalRandom 即:java.util.concurrent.ThreadLocalRandom SecureRandom即:java.security.SecureRandom Q:Random是不是线程安全的? A:Random是线程安全的,但是多线程下可能性能比较低. 参考: http://docs.oracle.com/javase/7/docs/api/java/util/Random.html http:

Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom(转)

文中的 Random即:java.util.Random,ThreadLocalRandom 即:java.util.concurrent.ThreadLocalRandomSecureRandom即:java.security.SecureRandom Q:Random是不是线程安全的?A:Random是线程安全的,但是多线程下可能性能比较低.参考:http://docs.oracle.com/javase/7/docs/api/java/util/Random.htmlhttp://stac

random 方法

dom   返回介于 0 和 1 之间的伪随机数. Math.random( ) 说明 产生的伪随机数介于 0 和 1 之间(含 0,不含 1),也就是,返回值可能为0,但总是小于1.在第一次加载 JScript 时随机数发生器自动产生 .

J2ME中Random类的使用

dom 在J2ME中,由于大部分的游戏都会涉及到随机性的事件,Random类自然就成为J2ME程序员经常使用的一个类了.但是对于新手来说,Random类看似简单,也有可能会出现这样那样的错误.所以在这里把我对于这个类的使用心得总结一下. random类在CLDC1.0中就已经定义了.这个类有两个构造函数Random() 和Random(long seed) 并且提供了四个常用方法: next(int bits) nextInt() nextLong() setSeed(long seed) 其中

random函数详解

dom|函数|详解    关于FLASH的效果,我想大家都想做出那种"不但让人一看忘不了,而且看了还想看"的效果吧?"一看忘不了"固然是高手作品,"看了还想看"也需要深厚功底和作品丰富的内涵.作为我们菜鸟,自然一时半全达不到那种高度.但是我们至少可以做到让人"每次看都有新鲜感",关键是什么? ActionScrpt!    当然,如题,我是想讲random函数.AS其它方面的就留给高手了.这篇是献给菜鸟们看的.虽说是给菜鸟看的

Displaying Random Record

dom System namespace has a Random class which is used for generating random numbers. This article explains how to display a random record from a database table using the random class. The Random class has an overloaded method named Next which will ge

C++中 随机访问(random access) 流(stream) 详解

随机访问流, 使用mark(标记)标注流的位置, 包含两种方法tell和seek; tell, 是返回流mark的位置, 包含g和p两种版本.g表示get, 指输入流; p表示put, 指输出流; seek, 是跳至流mark所指的位置, 也包含g和p两种版本;seek可以指定位置, 也可以指定偏移(offset); 代码如下: /* * cppprimer.cpp * * Created on: 2013.11.28 * Author: Caroline */ /*eclipse cdt, g