단일 모드 에서 병발 문 제 를 해결 하 다.

목차
최종 해결 방안
토론 은 왜 이렇게 쓰 는가?
최종 해결 방안
이중 검사 잠 금 은 먼저 인 스 턴 스 가 만 들 어 졌 는 지 확인 하고 만 들 지 않 았 다 면 동기 화 할 수 있 습 니 다.이렇게 되면 처음으로 동기 화 될 수 밖 에 없다.
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();
    }
	
}

주의 할 점:
  • 대상 은 volatile 키워드 로 수식 해 야 합 니 다
  • 잠 금 은 단일 대상 synchronized (SnowFlakeGenerateIDUtils. class)
  • 를 사용 합 니 다.
     
     
    토론 은 왜 이렇게 쓰 는가?
    코드 부터 볼 게 요.
    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
     

    좋은 웹페이지 즐겨찾기