디자인 모드: 단일 모드 의 쓰기 (기초 쓰기 와 스 레 드 안전 쓰기)

2624 단어 디자인 모드
단일 모드 의 서법 이 매우 많 으 므 로 먼저 가장 기본 적 인 서법 을 제시 합 니 다.
(A 가지 표기 법):
package singleton;

public class SingletonInstance {

	private static SingletonInstance mSingletonInstance = null;

	//            private,       new SingletonInstance()。
	private SingletonInstance() {

	}

	public static SingletonInstance getInstance() {
		if (mSingletonInstance == null) {
			mSingletonInstance = new SingletonInstance();
		}

		return mSingletonInstance;
	}
}

A 쓰 기 는 단일 모드 에서 가장 간단 하고 기본 적 이 며 뚜렷 한 쓰 기 였 으 나 안 타 깝 게 도 이런 쓰 기 는 라인 이 안전 하지 않 은 코드 쓰 기 였 다.만약 에 이런 종류 가 N 여러 개의 스 레 드 에서 동시에 방문 되 어 사용 된다 고 가정 한다. 특히 이런 종류 가 데이터 베이스 방문 등 스 레 드 안전 문제 에 민감 한 코드 응용 장면 과 관련 되면 그 결 과 는 재앙 이 될 것 이다.
그러나 단일 모델 의 A 가지 쓰기 도 광범 위 한 장면 이 있다. 스 레 드 안전 을 요구 하지 않 고 동기 화 수요 가 없 으 며 효율 적 인 우선 순위 가 높 은 장면 에서 단일 모델 의 A 가지 쓰기 방법 을 추천 한다.
B 종 쓰기 (스 레 드 보안 쓰기 1):
package singleton;

public class SingletonInstance {

	private static SingletonInstance mSingletonInstance = null;

	//            private,       new SingletonInstance()。
	private SingletonInstance() {

	}

	public static synchronized SingletonInstance getInstance() {
		if (mSingletonInstance == null) {
			mSingletonInstance = new SingletonInstance();
		}

		return mSingletonInstance;
	}
}

단일 모드 의 B 가지 문법 은 사실 A 가지 문법 을 바탕 으로 개선 한 것 이다. 요점 은 동기 화 메커니즘 인 synchronized 를 추가 한 것 이다.synchronized, 동기 화 는 특정한 의미 에서 볼 때 차단 입 니 다. 차단 의 결 과 는 임의의 시간 입 니 다. 하나의 스 레 드 만 이 동기 화 방법 체 의 코드 에 접근 할 수 있 습 니 다.이렇게 synchronized 된 코드 의 성능 은 떨 어 지지 만 스 레 드 안전 의 목적 을 달성 할 것 입 니 다.
B 가지 단일 모드 의 쓰기 방법 은 주로 스 레 드 안전 을 해결 하기 위해 서 입 니 다.변체 가 매우 많 고 변체 의 목적 은 주로 스 레 드 의 안전 한 조작 성 을 어떻게 강화 하 는 지 에 집중 된다.지금 예 를 들 면 다음 과 같다. 예 를 들 면:
B 종 서법 의 증강 형 변형 (라인 보안 서법 2):
package singleton;

public class SingletonInstance {

	//   !volatile            ,      volatile         。
	// volatile    。
	private static volatile SingletonInstance mSingletonInstance = null;

	//            private,       new SingletonInstance()。
	private SingletonInstance() {

	}

	public static SingletonInstance getInstance() {
		if (mSingletonInstance == null) {

			// synchronized (SingletonInstance.class)        ,         。
			//  synchronized (this)  ,    static  ,     this,   XXXClass.class
			// synchronized       :             (     ),           、          ,    ,    。
			//    ,    synchronized,           
			synchronized (SingletonInstance.class) {
				if (mSingletonInstance == null)
					mSingletonInstance = new SingletonInstance();
			}
		}

		return mSingletonInstance;
	}
}



좋은 웹페이지 즐겨찾기