단일 모드 에서 병발 문 제 를 해결 하 다.
최종 해결 방안
토론 은 왜 이렇게 쓰 는가?
최종 해결 방안
이중 검사 잠 금 은 먼저 인 스 턴 스 가 만 들 어 졌 는 지 확인 하고 만 들 지 않 았 다 면 동기 화 할 수 있 습 니 다.이렇게 되면 처음으로 동기 화 될 수 밖 에 없다.
public class SnowFlakeGenerateIDUtils {
public volatile static SnowFlakeGenerateIDUtils snowWork = null;
public static String getSnowId() {
// ,
if (snowWork == null) {
synchronized (SnowFlakeGenerateIDUtils.class) {
if (snowWork == null) {
snowWork = new SnowFlakeGenerateIDUtils(currentWorkerId, currentDatacenterId, currentSequence);
}
}
}
Long nextId = snowWork.nextId();
return nextId.toString();
}
}
주의 할 점:
토론 은 왜 이렇게 쓰 는가?
코드 부터 볼 게 요.
private Singleton() {}
public static Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
이 논 리 는 단일 스 레 드 프로그램 에서 잘 작 동 합 니 다.그러나 다 중 스 레 드 를 도입 하면 문제 가 생 길 수 있다.
개인 적 인 이해: 한 스 레 드 가 실행 대상 을 초기 화하 고 있 을 때 동료 다른 대상 도 들 어 왔 습 니 다. 대상 이 초기 화 되 지 않 았 고 초기 화 되 었 습 니 다.덮어 쓰 는 문제 가 동시에 발생 할 수 있 습 니 다.
Volatile Volatile 을 끌 어 내 는 것 은 경량급 synchronized 로 다 중 프로세서 개발 에서 공유 변수의 '가시 성' 을 확보 합 니 다.하나의 스 레 드 가 공유 변 수 를 수정 할 때 다른 스 레 드 는 이 수 정 된 값 을 읽 을 수 있다 는 뜻 이다.위의 대상 초기 화 작업 은 서로 다른 스 레 드 가 보이 지 않 는 문 제 를 해결 합 니 다.
이런 해결 방식 을 제외 하고 물론 다른 것 도 있 으 니 참고 할 수 있다.
https://blog.csdn.net/qq_36704549/article/details/104521878
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 에 대한 인식 (1)대상 을 만 드 는 데 사용 할 인 터 페 이 스 를 정의 하여 하위 클래스 가 어떤 종 류 를 예화 할 지 결정 합 니 다.Factory Method 는 클래스 의 실례 화 를 하위 클래스 로 지연 시 킵 니 다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.