자바 단일 모드 의 지식 점 상세 설명
게으름뱅이 모드 는 게 으 른 로드 입 니 다.사용 할 때 로드 하 는 것 입 니 다.스 레 드 안전 문제 가 존재 하 므 로 수 동 으로 잠 금 제어 가 필요 합 니 다.그것 의 장점 은 클래스 로 딩 속도 가 비교적 빠 르 고 필요 에 따라 로 딩 하여 자원 을 절약 하 는 것 이다.
굶 주 린 모드 는 클래스 를 불 러 올 때 인 스 턴 스 를 만 드 는 것 입 니 다.그것 은 천성적으로 라인 안전 문제 가 존재 하지 않 는 다.그러나 클래스 로드 의 속도 가 느 려 지고 자원 이 소모 된다.
게으름뱅이 모드-단일 검사
예제 코드 는 다음 과 같다.
public class LazySingleton {
private static LazySingleton singletoninstance = null;
private Object data = new Object();
//
private LazySingleton(){
}
//
public static synchronized LazySingleton getInstance(){
if(singletoninstance == null){
singletoninstance = new LazySingleton();
}
return singletoninstance;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
테스트 코드 는 다음 과 같 습 니 다:
public class TestThread extends Thread {
@Override
public void run() {
LazySingleton instance = LazySingleton.getInstance();
System.out.println(instance.getData());
}
}
public static void main(String[] args) {
for(int i =0;i < 10;i++){
TestThread t = new TestThread();
t.start();
}
}
}
실행 결 과 는 다음 과 같 습 니 다.java.lang.Object@306d3b64
java.lang.Object@306d3b64
java.lang.Object@306d3b64
java.lang.Object@306d3b64
java.lang.Object@306d3b64
java.lang.Object@306d3b64
java.lang.Object@306d3b64
java.lang.Object@306d3b64
java.lang.Object@306d3b64
java.lang.Object@306d3b64
같은 object 대상 을 출력 하여 같은 Lazy Singleton 대상 에서 얻 은 데 이 터 를 표시 합 니 다.
그러나 상기 코드 에 현저 한 문제 가 존재 합 니 다.여러 스 레 드 가 getInstance()를 동시에 방문 하 는 방법 은 모두 줄 을 서 는 것 입 니 다.설령 이 intance 가 만 들 어 졌 더 라 도.그러나 이 인 스 턴 스 가 만 들 어 졌 다 면 동시 방문 을 지원 할 수 있 습 니 다.자물쇠 에 대한 제어 입자 화 가 필요 합 니 다.
게으름뱅이 모드-이중 검사
public class LazySingleton {
// volatile
private static volatile LazySingleton singletoninstance = null;
private Object data = new Object();
private LazySingleton(){
}
public static synchronized LazySingleton getInstance(){
if(singletoninstance == null){
synchronized (LazySingleton.class) {
//
if(singletoninstance == null)
singletoninstance = new LazySingleton();
}
}
return singletoninstance;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
두 번 째 검 사 는 방지 하기 위 한 것 이다.스 레 드 A 에서 인 스 턴 스 가 생 성 되 지 않 은 것 을 발견 하고 자 물 쇠 를 신청 하여 임계 구역 에 들 어가 인 스 턴 스 를 만 듭 니 다.이 동시에 다른 스 레 드 도 인 스 턴 스 가 만 들 어 지지 않 은 것 을 발 견 했 습 니 다.그래서 인 스 턴 스 를 만 들 기 위해 자 물 쇠 를 신청 해 야 합 니 다.문 제 는 이렇게 발생 했 습 니 다.그리고 이 인 스 턴 스 변 수 는 volatile 로 밝 혀 져 야 합 니 다.즉,하나의 스 레 드 가 이 를 수정 하면 됩 니 다.(즉,예화)이 수정 은 바로 다른 스 레 드 를 볼 수 있 고 불필요 한 기다 림 을 피 할 수 있 습 니 다.
검사 코드 가 같 습 니 다.실행 결 과 는 같 습 니 다.
굶 주 린 남자 모델
public class HungerSingleton {
private static final HungerSingleton singletoninstance = new HungerSingleton();
private Object data = new Object();
private HungerSingleton(){
}
public static HungerSingleton getInstance(){
return singletoninstance;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
이 종 류 를 불 러 올 때 즉시 실례 화 인 스 턴 스 를 실행 합 니 다.스 레 드 안전 문제(jvm 에서 스 레 드 안전 문 제 를 보장 합 니 다)는 존재 하지 않 지만 자원 낭비,로드 속도 가 느 린 문제 가 존재 합 니 다.검사 코드 가 같 습 니 다.실행 결 과 는 같 습 니 다.
홀더 모드
정적 내부 클래스 를 이용 하여 인 스 턴 스 의 실례 화 를 실현 하 는 것 이다.정적 내부 클래스 의 특성 을 이용 합 니 다.이 내부 클래스 의 인 스 턴 스 는 외부 클래스 의 인 스 턴 스 와 연결 되 지 않 고 호출 되 어야 불 러 올 수 있 으 며 로드 지연 을 실현 합 니 다.
public class HolderSingleton {
private Object data = new Object();
private HolderSingleton(){
}
private static class InnerClass{
private static HolderSingleton singletoninstance = new HolderSingleton();
}
public static HolderSingleton getInstance(){
return InnerClass.singletoninstance;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
테스트 코드 가 같 습 니 다.실행 결 과 는 같 습 니 다.InnerClass 를 불 러 올 때 만 이 인 스 턴 스 를 예화 하여 로드 지연 을 실현 하고 굶 주 린 사람 모드 와 마찬가지 로 jvm 에서 스 레 드 안전 을 보장 합 니 다.이런 방법 은 추천 할 만하 다.
응용 필드:
전체 시스템 에서 하나의 인 스 턴 스 를 공유 하 는 클래스 만 단일 모드 로 실현 할 수 있 습 니 다.예 를 들 어:
사이트 의 계수 기 는 하나의 계수기 인 스 턴 스 만 존재 할 수 있 습 니 다.
스 레 드 탱크 는 하나의 스 레 드 탱크 대상 만 존재 할 수 있 습 니 다.
연결 탱크 는 하나의 연결 탱크 대상 만 존재 할 수 있 습 니 다.
지식 포인트 확장:
1.왜 단일 모드 를 사용 합 니까?
우리 의 일상적인 업무 에서 많은 대상 들 이 매우 중요 한 시스템 자원 을 점용 한다.예 를 들 어 IO 처리,데이터 베이스 작업 등 이다.그러면 우 리 는 이런 대상 들 이 하나의 공용 인 스 턴 스,즉 단일 사례 만 사용 하 는 것 을 제한 해 야 한다.
2.단일 모델 의 실현 방식
구조 함수 의 사유 화 는 다른 종류의 유일한 공용 실례 밖의 실례 를 생 성 하 는 것 을 방지한다.또한 단일 클래스 는 final 로 정의 되 어야 합 니 다.즉,단일 클래스 는 계승 할 수 없습니다.그 하위 클래스 를 계승 할 수 있다 면 인 스 턴 스 를 만 들 수 있 고 유일한 인 스 턴 스 의 취지 에 어 긋 나 기 때 문 입 니 다.
클래스 의 정적 변 수 는 단일 인 스 턴 스 의 인용 을 저장 합 니 다.
하나의 인 스 턴 스 의 인용 을 얻 기 위해 공 통 된 정적 방법
3.단일 모드 UML 도표
![](https://s1.md5.ltd/image/060935e5cf059419afafd6b206e9416c.png)
4.단일 모델 의 전형 적 인 실현 방식
4.567917.굶 주 린 사람 식:처음부터 인 스 턴 스 를 만 들 고 호출 할 때마다 바로 돌아 갑 니 다.전형 적 인'공간 으로 시간 을 바 꿉 니 다'4.567917.게으름뱅이 식:로 딩 지연,첫 번 째 호출 할 때 만 로 딩 한 다음 에 돌아 갑 니 다.이후 의 매번 호출 은 바로 돌아 갑 니 다.전형 적 인'시간 으로 공간 을 바꾼다'는 것 은 다 중 스 레 드 환경 에서 스 레 드 안전 문 제 를 해결 하 는 데 주의해 야 한다4.567917.등록 식:하나의 사례 모델 을 유지 하 는 것 은 주로 수량 적 인 확장 입 니 다.스 레 드 안전 한 map 를 통 해 하나의 사례 를 저장 합 니 다.이렇게 호출 할 때 이 사례 가 이미 만 들 어 졌 는 지 판단 하고 그렇지 않 으 면 바로 돌아 갑 니 다.그렇지 않 으 면 map 에 등록 한 다음 에 돌아 갑 니 다이번 우리 소 편 이 여러 편 을 결합 해 정리 한 내용 이 니 도움 이 되 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.