잠 금 을 넣 지 않 은 상태 에서 스 레 드 안전 한 단일 모드 를 실현 합 니 다.

첫째, 단일 모델 의 몇 가지 실현 방식 a. 굶 주 린 식 (스 레 드 가 안전 하고 호출 효율 이 높 지만 로드 를 지연 시 킬 수 없다)
/**
 *     
 * @author shixiangcheng
 * 2019-07-21
 */
public class Singleton {
    private static final Singleton singleton=new Singleton();
    private Singleton(){
    	System.out.println("==");
    }
    public static Singleton getInstance(){
    	return singleton;
    }
}

b. 게으름뱅이 식 (스 레 드 가 안전 하고 호출 효율 이 높 지 않 지만 시간 을 끌 어 로드 할 수 있 습 니 다)
/**
 *     
 * @author shixiangcheng
 * 2019-07-21
 */
public class Singleton {
    private static Singleton singleton=null;
    private Singleton(){
    	System.out.println("==");
    }
    //    ,     
    public static synchronized Singleton getInstance(){
        if(singleton==null){
        	singleton=new Singleton();
        }
        return singleton;
    }
}

c. 정적 내부 클래스 구현 모드 (스 레 드 가 안전 하고 호출 효율 이 높 으 며 로드 지연 가능)
/**
 *     
 * @author shixiangcheng 
 * 2019-07-21
 */
public class Singleton {
	private Singleton() {System.out.println("create instance");}
	private static class SingletonClassInstance {
		private static final Singleton singleton = new Singleton();
	}
	public static Singleton getInstance() {
		return SingletonClassInstance.singleton;
	}
}

d. 매 거 진 클래스 (스 레 드 가 안전 하고 호출 효율 이 높 으 며 로드 를 지연 시 킬 수 없 으 며 반사 와 반 직렬 화 호출 을 천연 적 으로 방지 할 수 있 습 니 다)
/**
 *     
 * @author shixiangcheng 
 * 2019-07-21
 */
public enum Singleton {
	//          
	INSTANCE;
	//         
	public void singletonOperation(){
		System.out.println("do");
	}
}

- 단일 대상 이 자원 을 적 게 차지 하고 시간 을 끌 지 않 아 도 됩 니 다. 굶 주 린 사람 보다 좋 습 니 다. - 단일 대상 이 자원 을 많이 차지 하고 시간 을 끌 어 로드 해 야 합 니 다. 정적 내부 류 는 게 으 른 사람 보다 좋 습 니 다.
상기 몇 가지 답 은 클래스 로드 를 빌 렸 을 때 단일 예 를 초기 화 하 는 것 이다.ClassLoader 의 스 레 드 보안 체 제 를 빌 린 것 이다.ClassLoader 의 스 레 드 보안 메커니즘 이란 ClassLoader 의 loadClass 방법 이 클래스 를 불 러 올 때 synchronized 키 워드 를 사용 한 것 입 니 다.다시 쓰 이지 않 는 한 이 방법 은 기본적으로 전체 적재 과정 에서 동기 화 되 기 때문에 라인 의 안전 을 보장 합 니 다.그래서 상기 여러 가지 방법 은 synchronized 를 표시 하지 않 았 지만 그 밑바닥 실현 원 리 는 synchronized 를 사용 했다.둘째, CAS 기술 을 사용 하여 자물쇠 없 는 병행 을 실현 하고 라인 의 안전 을 확보한다.이 를 통 해 CAS 기술 을 알 수 있 습 니 다. CAS 는 낙관적 인 잠 금 기술 입 니 다. 여러 스 레 드 가 CAS 를 사용 하여 같은 변 수 를 동시에 업데이트 하려 고 할 때 그 중의 한 스 레 드 만 변수의 값 을 업데이트 할 수 있 고 다른 스 레 드 는 모두 실 패 했 습 니 다. 실패 한 스 레 드 는 걸 리 지 않 고 이번 경쟁 에서 실 패 했 음 을 알 리 고 다시 시도 할 수 있 습 니 다.단일 사례 를 실현 하 는 방식 은 다음 과 같다.
import java.util.concurrent.atomic.AtomicReference;
/**
 *   CAS      
 * @author shixiangcheng
 * 2019-12-20
 */
public class Singleton {
	private static final AtomicReference INSTANCE=new AtomicReference();
	private Singleton(){}
	public static Singleton getInstance(){
		for(;;){
			Singleton singleton=INSTANCE.get();
			if(singleton!=null){
				return singleton;
			}
			singleton=new Singleton();
			if(INSTANCE.compareAndSet(null, singleton)){
				return singleton;
			}
		}
	}
}

CAS 의 장점 은 전통 적 인 잠 금 체 제 를 사용 하여 스 레 드 안전 을 확보 하지 않 아 도 된다 는 것 이다. CAS 는 바 쁜 기다 림 을 바탕 으로 하 는 알고리즘 으로 바 텀 하드웨어 의 실현 에 의존 하 며 잠 금 에 비해 스 레 드 전환 과 차단 의 추가 소모 가 없 기 때문에 비교적 큰 병행 도 를 지원 할 수 있다.CAS 의 중요 한 단점 중 하 나 는 바 쁜 기다 림 이 계속 실행 되 지 않 으 면 CPU 에 큰 실행 비용 을 초래 할 수 있다 는 것 이다.또한 N 개의 스 레 드 가 singleton = new Singleton () 에 동시에 실 행 될 경우;많은 대상 이 생 성 되 어 메모리 가 넘 칠 수 있 습 니 다.
도움 이 될 것 같 으 면 좋아요 눌 러 주세요.선생님 께 서 는 '좋아요' 를 누 르 는 사람 이 가장 아름답다 고 말씀 하 셨 다.

좋은 웹페이지 즐겨찾기