랜덤 클래스 스레드는 안전합니까?
1개의 인스턴스를 공유해도 될까요?Random
여러 스레드 간의 클래스전화하기 위해서nextInt(int)
특히 여러 스레드로부터 얻을 수 있을까요?
여러 스레드에서 사용해도 여전히 랜덤 번호를 생성할 수 있다는 점에서 스레드 세이프입니다.
Sun/Oracle JVM 구현에서는 동기 및 AtomicLong을 시드로 사용하여 스레드 간의 일관성을 향상시킵니다.다만, 이 메뉴얼에서는, 모든 플랫폼이 이 기능을 갖추고 있는 것은 아닌 것 같습니다.
나는 당신의 프로그램을 그런 보증을 요구하기 위해 쓰지 않을 것이다, 특히 당신이 그 순서를 결정할 수 없기 때문에.nextInt()
호출됩니다.
항상 그랬던 것은 아니지만 스레드 세이프입니다.
상세한 것에 대하여는, http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6362070 를 참조해 주세요.
Java 6의 매뉴얼에 따라 Math.random()을 사용하면 여러 스레드에서 안전하게 사용할 수 있습니다.하지만 랜덤 클래스는 그렇지 않습니다.그럼 직접 맞춰야 할 것 같네요
편집:
그러나 받아들여진 답변에 따르면 Java 7과 Random 클래스에서도 보증을 제공하는 것 같아 문서가 변경된 것 같습니다.
네, 랜덤은 스레드 세이프입니다.그nextInt()
메서드가 보호됨next(int)
사용하는 방법AtomicLong seed, nextseed
(원자 길이) 다음 씨앗을 생성합니다.AtomicLong
시드 생성 시 스레드 안전을 위해 사용됩니다.
말했듯이 스레드 세이브이지만 사용하는 것이 현명할 수 있습니다.java.util.concurrent.ThreadLocalRandom
이 기사에 따르면 (링크가 끊어짐)ThreadLocalRandom은 Random의 서브클래스이기 때문에 하위 호환성이 있습니다.
이 기사에서는 다양한 랜덤 클래스의 프로파일링 결과를 비교했습니다.
java.util.Random
,java.util.concurrent.ThreadLocalRandom
그리고.java.lang.ThreadLocal<java.util.Random>
그 결과 ThreadLocalRandom의 사용이 가장 퍼포먼스가 높고 ThreadLocal이 그 뒤를 이으며 Random 자체의 퍼포먼스가 가장 나쁜 것으로 나타났습니다.
여러 스레드가 동일한 랜덤을 사용하지 못할 이유가 없습니다.단, 클래스는 명시적으로 스레드 세이프가 아니며 시드를 통해 의사 난수 시퀀스를 유지하기 때문입니다.여러 스레드는 동일한 난수로 끝날 수 있습니다.각 스레드에 대해 여러 개의 Random을 작성하고 다른 방식으로 시드하는 것이 좋습니다.
편집: Sun 실장에서는 Atomic Long이 사용되고 있는 것을 방금 알았습니다.따라서 스레드 세이프인 것 같습니다(Peter Lawrey(+1)도 언급).
EDIT2: OpenJDK는 시드에 Atomic Long도 사용합니다.다른 사람들이 말했듯이, 이것에 의존하는 것은 여전히 좋지 않다.
랜덤이 원자변수를 사용한다고 가정하지 않고 문제를 해결한 방법은 다음과 같습니다.할 수 요.currentTime * thread id
미래에는 동등하지만, 제 욕구에는 충분히 드문 일입니다.콜리젼의 가능성을 확실히 회피하기 위해서, 각 요구에 일의의 클럭타임스탬프를 대기시킬 수 있습니다.
/**
* Thread-specific random number generators. Each is seeded with the thread
* ID, so the sequence of pseudo-random numbers are unique between threads.
*/
private static ThreadLocal<Random> random = new ThreadLocal<Random>() {
@Override
protected Random initialValue() {
return new Random(
System.currentTimeMillis() *
Thread.currentThread().getId());
}
};
Random
클래스는 하나의 인스턴스가 여러 스레드에서 사용하도록 설정되지 않았습니다.물론 이렇게 하면 예측할 수 없고 난수에 가까워질 가능성이 높아집니다.그러나 이것은 의사 랜덤 생성기이기 때문에 왜 인스턴스를 공유할 필요가 있는지 알 수 없습니다.좀 더 구체적인 요건이 있나요?
언급URL : https://stackoverflow.com/questions/5819638/is-random-class-thread-safe
'it-source' 카테고리의 다른 글
카본 날짜 인스턴스 형식 지정 (0) | 2023.01.23 |
---|---|
mariadb와 python2.7을 연결하는 방법이 있습니까? (0) | 2023.01.23 |
Vue v-model에서 크롬 자동 완료를 감지하지 못함 (0) | 2023.01.23 |
Java EE란 무엇인가? (0) | 2023.01.23 |
jQuery를 사용하여 요소에 "style=display:"block"을 추가하려면 어떻게 해야 합니까? (0) | 2023.01.23 |