단일 모드 에 대해 서 얘 기해 볼 게 요.
6838 단어 자바 기반
전체적으로 말 하면 게으름뱅이 형 과 굶 주 린 남자 형 사례 모델 로 나 눌 수 있 는데 다음 에 몇 가지 사례 모델 의 작성 방법 을 열거 하고 하나씩 분석 하 겠 습 니 다.
1. 굶 주 린 한식 단일 모드 (라인 안전)
package com.wantao.concurrency.singleton;
/**
* 1
*/
public class Singleton1 {
private static Singleton1 instance = new Singleton1();//
private Singleton1() {
}
public static Singleton1 getInstance() {
return instance;
}
public static void main(String[] args) {
System.out.println(Singleton1.getInstance().hashCode());
System.out.println(Singleton1.getInstance().hashCode());
}
}
분석: 이것 은 굶 주 린 사람 형 단일 사례 모델 의 전형 적 인 쓰기 입 니 다. 클래스 로 딩 할 때 대상 을 만 들 었 기 때문에 이런 방식 은 스 레 드 안전 에 속 합 니 다.
2. 굶 주 린 사람 형 단일 모드 (스 레 드 안전)
package com.wantao.concurrency.singleton;
/**
* 2
*/
public class Singleton2 {
private static Singleton2 instance = null;
static {
instance = new Singleton2();
}
private Singleton2() {
}
public static Singleton2 getInstance() {
return instance;
}
public static void main(String[] args) {
System.out.println(Singleton2.getInstance().hashCode());
System.out.println(Singleton2.getInstance().hashCode());
}
}
분석: 이것 도 굶 주 린 한 식 단일 사례 모델 입 니 다. 위의 쓰기 에 비해 대상 을 만 드 는 과정 을 static 코드 블록 에 두 었 을 뿐 입 니 다. 단, 주의해 야 합 니 다.
3. 게으름뱅이 형 단일 모드 (라인 이 안전 하지 않 음)
package com.wantao.concurrency.singleton;
/**
* 1
*/
public class Singleton3 {
private Singleton3() {
}
private static Singleton3 instance = null;
public static Singleton3 getInstance() {
if (instance == null) {
instance = new Singleton3();
}
return instance;
}
public static void main(String[] args) {
System.out.println(Singleton3.getInstance().hashCode());
System.out.println(Singleton3.getInstance().hashCode());
}
}
분석: 이것 은 가장 간단 한 게으름뱅이 식 단일 사례 모델 로 첫 번 째 방문 때 만 인 스 턴 스 를 만 듭 니 다.그러나 이런 표기 법 은 라인 이 안전 하지 않다.
A, B 두 스 레 드 가 동시에 getInstance () 방법 으로 생 성 된다 고 가정 하면 인 스 턴 스 가 모두 비어 있 고 두 스 레 드 모두 new 새로운 대상 이 됩 니 다.
4. 게으름뱅이 모드 (라인 은 안전 하지만 추천 하지 않 음)
package com.wantao.concurrency.singleton;
/**
* 2
*/
public class Singleton4 {
private Singleton4() {
}
private static Singleton4 instance = null;
public static synchronized Singleton4 getInstance() {
if (instance == null) {
instance = new Singleton4();
}
return instance;
}
public static void main(String[] args) {
System.out.println(Singleton4.getInstance().hashCode());
System.out.println(Singleton4.getInstance().hashCode());
}
}
분석: synchronized 동기 화 방법 을 사용 하여 스 레 드 가 안전 하지만 매번 한 스 레 드 만 대상 을 얻 을 수 있 고 효율 이 너무 낮 습 니 다.
5. 게으름뱅이 형 단일 모드 (라인 은 안전 하지만 추천 하지 않 음)
package com.wantao.concurrency.singleton;
/**
* 3
*/
public class Singleton5 {
private Singleton5() {
}
private static Singleton5 instance = null;
public static Singleton5 getInstance() {
synchronized (Singleton5.class) {
if (instance == null) {
instance = new Singleton5();
}
}
return instance;
}
public static void main(String[] args) {
System.out.println(Singleton5.getInstance().hashCode());
System.out.println(Singleton5.getInstance().hashCode());
}
}
분석: 이런 문법 은 위 와 같 지만 synchronized 수식 은 방법 이 아니 라 코드 블록 이다.
6. 게으름뱅이 형 단일 모드 (스 레 드 가 안전 하지 않 음)
package com.wantao.concurrency.singleton;
/**
* 4
*/
public class Singleton6 {
private Singleton6(){
}
private static Singleton6 instance=null;
public static Singleton6 getInstance(){
if(instance==null){
synchronized (Singleton6.class){
if(instance==null){
instance=new Singleton6();
}
}
}
return instance;
}
public static void main(String[] args) {
System.out.println(Singleton6.getInstance().hashCode());
System.out.println(Singleton6.getInstance().hashCode());
}
}
분석: 이중 검 측 과 synchronized (double checked locking) 를 사용 하여 단일 모드 를 실현 합 니 다. 스 레 드 가 안전 해 보이 지만 jvm 의 명령 으로 재배 치 되 는 것 도 안전 하지 않 습 니 다.
새 대상 은 보통 세 단계:
1. 더미 위 에 메모리 공간 할당
2. 대상 초기 화
3. 대상 의 인용 을 방금 분 배 된 메모리 공간 으로 가리킨다.
그러나 jvm 의 명령 을 거 쳐 정렬 한 후 순 서 는 132 로 바 뀔 수 있 습 니 다.
이렇게 하면 A, B 두 개의 스 레 드 가 있 으 면 A 스 레 드 가 1, 3 두 단 계 를 완 료 했 을 때 B 스 레 드 는 이때 도 대상 을 가 져 오고 초기 화 되 지 않 은 대상 을 가 져 옵 니 다.
7. 게으름뱅이 형 단일 모드 (스 레 드 안전, 추천 사용)
package com.wantao.concurrency.singleton;
/**
* 5
*/
public class Singleton7 {
private Singleton7(){
}
private static volatile Singleton7 instance=null;
public static Singleton7 getInstance(){
if(instance==null){
synchronized (Singleton7.class){
if(instance==null){
instance=new Singleton7();
}
}
}
return instance;
}
public static void main(String[] args) {
System.out.println(Singleton7.getInstance().hashCode());
System.out.println(Singleton7.getInstance().hashCode());
}
}
분석: 위의 방법 에 비해 volatile 키 워드 를 사용 하여 명령 정렬 을 금지 하여 스 레 드 를 안전 하 게 만 들 었 습 니 다.
8. 게으름뱅이 형 단일 모드 (스 레 드 안전, 추천 사용)
package com.wantao.concurrency.singleton;
/**
* 6
*/
public class Singleton8 {
private Singleton8(){
}
public static Singleton8 getInstance(){
return Singleton.INSTANCE.getInstance();
}
private enum Singleton{
INSTANCE;
private Singleton8 instance;
Singleton(){
instance=new Singleton8();
}
public Singleton8 getInstance(){
return instance;
}
}
public static void main(String[] args) {
System.out.println(Singleton8.getInstance().hashCode());
System.out.println(Singleton8.getInstance().hashCode());
}
}
분석: enum (매 거 진) 방식 을 사용 합 니 다. 기본 값 은 라인 이 안전 합 니 다. 추천 합 니 다.
굶 주 린 한식 과 게 으 른 단식 모드 비교:
1. 굶 주 린 사람 은 클래스 로 딩 할 때 인 스 턴 스 를 만 들 었 습 니 다. 그 자체 가 스 레 드 가 안전 하고 게 으 른 사람 은 첫 번 째 호출 에서 인 스 턴 스 를 만 들 었 습 니 다. 잠 금 이나 enum 을 추가 하여 스 레 드 안전 을 실현 해 야 합 니 다.
2. 배 고 픈 한식 단일 모드 는 잠 금 을 넣 지 않 아 효율 이 높 지만 처음부터 예화 되 었 으 나 마지막 에 호출 되 지 않 으 면 메모 리 를 낭비 합 니 다.
전 재 는 글 의 주 소 를 밝 혀 주 십시오:https://blog.csdn.net/niangou0915/article/details/90316476
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
범용 용법 예시앞으로 51CTO 에 정착 해 기술 개발 에 전념 할 테 니 잘 부탁드립니다.다음 코드 는 자신 이 (저자: 이 흥 화) 를 공부 할 때 두 드 린 코드 로 주석 이 완비 되 어 있다. 범용 클래스 Point. ja...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.