자바 에서 전면적 인 단일 모델 의 다양한 실현 방식 을 분석 하 다.
자바 병발 에 관 한 지식 을 정리 하려 면 어디서부터 시작 해 야 할 지 모 르 겠 습 니 다.단일 모드 에서 고려 해 야 할 스 레 드 안전 이 생각 나 면 단일 모드 부터 시작 하 세 요.예전 에 단일 사례 모델 을 쓴 적 이 있 는데 여기 서 다시 모 아서 보충 하고 정리 한 다음 에 단일 사례 모델 의 여러 가지 실현.
단일 모델 의 주요 사상 은:
2.단일 모드 의 N 가지 실현 방식
2.1.굶 주 린 사람 식(스 레 드 안전,사용 가능)
public class Singleton {
private Singleton() {
}
private static Singleton sSingleton = new Singleton();
public static Singleton getInstance() {
return sSingleton;
}
}
public class Singleton {
private Singleton() {
}
public static final Singleton sSingleton = new Singleton();
}
인 스 턴 스 대상 을public static final
로 수식 하고 공개 적 인 방법 으로 인 스 턴 스 를 얻 지 않 으 며 직접Singleton.sSingleton
를 통 해 얻 을 수 있 습 니 다.
public class Singleton {
private Singleton() {
}
private static Singleton sSingleton;
public static Singleton getInstance() {
if (sSingleton == null) {
sSingleton = new Singleton();
}
return sSingleton;
}
}
public class Singleton {
private Singleton() {
}
private static Singleton sSingleton;
public synchronized static Singleton getInstance() {
if (sSingleton == null) {
sSingleton = new Singleton();
}
return sSingleton;
}
}
getInstance
이 동기 화 되 어 불필요 한 동기 화 비용 을 초래 합 니 다.이런 모델 은 일반적으로 사용 하 는 것 을 권장 하지 않 습 니 다.
public class Singleton {
private Singleton() {
}
/**
* volatile is since JDK5
*/
private static volatile Singleton sSingleton;
public static Singleton getInstance() {
if (sSingleton == null) {
synchronized (Singleton.class) {
// , instance
if (sSingleton == null) {
sSingleton = new Singleton();
}
}
}
return sSingleton;
}
}
sSingleton=new Singleton()은 원자 조작 이 아 닙 니 다.(XXX)그러므로volatile
키 워드 를 추가 해 야 합 니 다.이 키 워드 는 jdk 1.5 이후 버 전에 있 습 니 다.
public class Singleton {
private Singleton () {
}
private static class InnerClassSingleton {
private final static Singleton sSingleton = new Singleton();
}
public static Singleton getInstance() {
return InnerClassSingleton.sSingleton;
}
}
장점:추천 사용.2.7.매 거 진 사례(스 레 드 안전,사용 권장 하지 않 음)
public enum Singleton{
INSTANCE;
//
public void doSomething(){
...
}
}
import java.util.HashMap;
import java.util.Map;
public class Singleton {
private static Map<String, Object> objMap = new HashMap<String, Object>();
private Singleton() {
}
public static void registerService(String key, Object instance) {
if (!objMap.containsKey(key)) {
objMap.put(key, instance);
}
}
public static Object getService(String key) {
return objMap.get(key);
}
}
HashMap 용기 key 의 중복 되 지 않 는 특성 을 이용 하 였 습 니 다.앞의 여러 가지 실현 방법 중에서 우 리 는 구조 방법 에 따라 사유 화 된 사상 으로 이 루어 진 것 이 많다.우 리 는 반 사 를 이용 하여 새로운 대상 을 만 들 수 있다 는 것 을 알 고 있다.그러면 반사 장면 에서 이런 사상 이 실현 하 는 단일 모델 은 효력 을 잃 는 다.그러면 어떻게 반사 파괴 단일 모델 을 방지 할 수 있 습 니까?원 리 는 하나의 실례 가 존재 하 는 상황 에서 구조 방법 을 다시 호출 할 때 이상 을 던 지 는 것 이다.다음은 정적 내부 클래스 의 단일 예 모드 를 예 로 들 면:
public class Singleton {
private static boolean flag = false;
private Singleton(){
synchronized(Singleton.class)
{
if(flag == false)
{
flag = !flag;
}
else
{
throw new RuntimeException(" !");
}
}
}
private static class InnerClassSingleton {
private final static Singleton sSingleton = new Singleton();
}
public static Singleton getInstance() {
return InnerClassSingleton.sSingleton;
}
}
2.10.직렬 화 와 반 직렬 화 파괴 사례 를 방지한다.직렬 화 를 통 해 하나의 대상 인 스 턴 스 를 디스크 에 기록 하고 반 직렬 화 를 통 해 다시 읽 을 때 구조 방법 이 개인 적 이 더 라 도 특수 한 경 로 를 통 해 새로운 인 스 턴 스 를 만 들 수 있 으 며 이러한 구조 함 수 를 호출 하 는 것 과 같다.이 문 제 를 피 하려 면 코드 에 다음 과 같은 방법 을 추가 하여 역 직렬 화 과정 에서 readResolve 방법 을 실행 할 때 sSingleton 대상 으로 돌아 가게 해 야 합 니 다.
private Object readResolve() throws ObjectStreamException {
return sSingleton;
}
결어어떤 상황 에서 도 하나의 사례 로 이 루어 지 는 방식 이 있 습 니까?
있다위 에서 말 한 매 거 일례 다.매 거 를 통 해 모든 상황 에서 하나의 사례 이 고 스 레 드 가 안전 하 다 는 것 을 보증 할 수 있다.
이상 은 자바 에서 전면적 인 단일 모델 의 다양한 실현 방식 에 대한 상세 한 내용 을 분석 하 는 것 입 니 다.자바 단일 모델 의 실현 방식 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 시기 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.