실패한volatile 검증
이미 알고 있는 이해에 따라 new의 새로운 대상이 나타날 때 원자 조작이 나타납니다.
4
4
4
volatile 파라미터를 사용하지 않으면 1-3-2의 실행 순서가 나타날 수 있습니다. 그러면 instance==null을 판단할 때 instance가 비어 있지 않고 instance로 되돌아갈 수 있습니다. 그러나 실제로 이 instance는 여전히null입니다.volatile이라는 인자를 사용하면 정렬을 금지합니다. 상기 과정은 1-2-3의 순서에 따라 실행됩니다.그리고 나서 나는 CountDownLatch를 사용하여 높은 병발을 시뮬레이션해서 instance==null이null인 상황이 나타날지 테스트했다.
유감스럽게도 맥에 2000개의 라인을 추가하여 동시에 깨우기 (실제로는 이렇게 많지 않다. cpu가 제한되어 있기 때문에) 안드로이드는 300개의 라인을 동시에 깨우기 위해 여러 번 반복했지만 null로 나타나지 않았다.
옆에 기술이 좋은 동료와 이야기를 나눴는데 이런 상황은 높은 서버(cpu 멀티코어)를 설정하고 대량으로 병발할 때 나타날 수 있다. 안드로이드나 나 나 같은 저조맥에서 나타날 확률이 비교적 적다고 생각했다.
실패한 테스트라고 할 수 있겠지.기록해.참고 사항: 논의 사항 파악
테스트 클래스 첨부:
public class Singleton {
// volatile
private static Singleton instance;
private Singleton() {
}
//
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
public static void main(String[] args) {
init();
}
/**
*
*/
public static final int THREAD_NUM = 1000;
/**
*
*/
private static long startTime = 0L;
private static volatile int num = 0;
public static void init() {
try {
startTime = System.currentTimeMillis();
System.out.println("CountDownLatch started at: " + startTime);
// 1
CountDownLatch countDownLatch = new CountDownLatch(1);
for (int i = 0; i < THREAD_NUM; i++) {
new Thread(new Run(countDownLatch)).start();
}
//
countDownLatch.countDown();
} catch (Exception e) {
System.out.println("Exception: " + e);
}
}
/**
*
*/
private static class Run implements Runnable {
private final CountDownLatch startLatch;
public Run(CountDownLatch startLatch) {
this.startLatch = startLatch;
}
@Override
public void run() {
try {
//
startLatch.await();
//
Singleton instance = getInstance();
if (instance == null) {
System.out.print("Thread.currentThread() =" + Thread.currentThread().getId() + (instance == null ? "instance = null" : " " + "
"));
}
// num = num + 1;
// System.out.print("num = " + num + "
");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.