단일 디자인 모델에서 게으름뱅이 라인의 안전 문제를 완벽하게 해결하다

먼저 다음 예제를 작성합니다.

public class SingleDemo { 
  private static SingleDemo s = null; 
  private SingleDemo(){} 
  public static SingleDemo getInstance(){ 
    if(s == null){ 
      s = new SingleDemo(); 
    } 
    return s; 
  } 
} 
테스트 클래스 쓰기:

public class ThreadDemo3 { 
   
  public static void main(String[] args) { 
    SingleDemo s1 = SingleDemo.getInstance(); 
    SingleDemo s2 = SingleDemo.getInstance(); 
    System.out.println(s2 == s2); 
  } 
} 

실행 결과는 줄곧true입니다. 단선 아래에는 문제가 없다는 것을 설명합니다. 다음은 다중 라인을 써서 단례에 접근합니다.

public class ThreadTest implements Runnable { 
  // , Set  
  public Set<SingleDemo> singles = new HashSet<SingleDemo>(); 
  @Override 
  public void run() { 
    //  
    SingleDemo s = SingleDemo.getInstance(); 
    //  
    singles.add(s); 
  } 
} 

다중 스레드 동시 액세스 예제 사용:

public class ThreadDemo3 { 
   
  public static void main(String[] args) { 
//   SingleDemo s1 = SingleDemo.getInstance(); 
//   SingleDemo s2 = SingleDemo.getInstance(); 
//   System.out.println(s2 == s2); 
    ThreadTest t = new ThreadTest(); 
    new Thread(t).start(); 
    new Thread(t).start(); 
    new Thread(t).start(); 
    new Thread(t).start(); 
    new Thread(t).start(); 
    new Thread(t).start(); 
    new Thread(t).start(); 
    new Thread(t).start(); 
    System.out.println(t.singles); 
  } 
} 

실행 결과는 다음과 같습니다.
[com.persagy.thread.SingleDemo@1bc4459, com.persagy.thread.SingleDemo@150bd4d]
또는
[com.persagy.thread.SingleDemo@12b6651]
라인이 있고 접근 안전 문제가 있다는 것을 설명하는데, 얻은 것이 반드시 같은 실례는 아니다
어떻게 스레드 안전 문제를 해결합니까?
동기화 잠금 메커니즘을 썼죠.
다음 개선 사례:

public class SingleDemo {
	private static SingleDemo s = null;
	private SingleDemo(){}
	public static synchronized SingleDemo getInstance(){
		if(s == null){
			s = new SingleDemo();
		}
		return s;
	}
}
동기화 함수를 넣은 후 스레드 안전 문제가 해결되었다
여러 번 실행하면 같은 실례를 가져옵니다. 두 실례가 나타나지 않습니다.
[com.persagy.thread.SingleDemo@12b6651]
그러나 다중 스레드가 병렬 방문하는 상황에서 모든 스레드가 실례를 얻을 때마다 자물쇠를 판단하고 효율이 비교적 낮다. 효율을 높이기 위해 나는 이중 판단 방법을 추가하여 효율 문제를 해결했다.
코드는 다음과 같습니다.

public class SingleDemo {
	private static SingleDemo s = null;
	private SingleDemo(){}
	public static SingleDemo getInstance(){
		/* ,
		 *  */
		if(s == null){
			// , 
			synchronized(SingleDemo.class){
				if(s == null){
					s = new SingleDemo();
				}
			}
		}
		return s;
	}
}
이런 방식으로 게으름뱅이식의 스레드 안전 문제를 해결하고 효율을 높였지만 실제 개발에서 게으름뱅이식을 사용하는 것이 비교적 많다. 왜냐하면 이 코드는 비교적 많고 번거롭기 때문이다.
이상은 바로 여러분이 가져온 완벽한 해결 사례 디자인 모델에서 게으름뱅이 라인의 안전 문제의 모든 내용입니다. 많은 응원 부탁드립니다~

좋은 웹페이지 즐겨찾기