Java 멀티스레드 2.1.다중 스레드 고정 잠금 장치

다중 스레드 고정 잠금 장치


 

1. 개체 Lock 잠금


동기화 코드 블록과 동기화 방법의 자물쇠 대상 문제를 이해할 수 있지만 어디에 자물쇠를 달았는지, 어디서 자물쇠를 풀었는지 직접 보지 못했다.
JDK5는 잠금을 추가하고 해제하는 방법을 더욱 명확하게 표현하기 위해 앞으로 새로운 잠금 대상 Lock을 제공했다.
  • Lock: 단일 인터페이스
  • void lock()
  • void unlock()

  • ReentrantLock:Lock 인터페이스의 구체적인 실현 클래스
  • 2. 동기화 폐단:

  • 비효율
  • 동기화 플러그인이 발생하면 잠금 문제가 발생하기 쉽다
  • 3. 잠금 해제 문제와 코드 설명:

  • 는 두 개 혹은 두 개 이상의 라인이 집행되는 과정에서 자원 쟁탈로 인해 서로 기다리는 현상을 가리킨다
  • 동기화 코드 블록의 끼워넣기 사례
  • (1) 스레드 클래스 만들기

    package cn.itcast_02;
    
    public class DieLock extends Thread {
    
    	private boolean flag;
    
    	public DieLock(boolean flag) {
    		this.flag = flag;
    	}
    
    	@Override
    	public void run() {
    		if (flag) {
    			synchronized (MyLock.objA) {
    				System.out.println("if objA");
    				synchronized (MyLock.objB) {
    					System.out.println("if objB");
    				}
    			}
    		} else {
    			synchronized (MyLock.objB) {
    				System.out.println("else objB");
    				synchronized (MyLock.objA) {
    					System.out.println("else objA");
    				}
    			}
    		}
    	}
    }
    

    (2) 잠금 생성

    package cn.itcast_02;
    
    public class MyLock {
    	//  
    	public static final Object objA = new Object();
    	public static final Object objB = new Object();
    }
    

    (3) 테스트 스레드 클래스

    package cn.itcast_02;
    
    /*
     *  :
     * 		A: 
     * 		B: 
     *  :
     * 		 , 。
     *  :
     * 		 , 。
     * 		 :
     * 			 : 
     * 			 : 
     * 		 :
     * 			 : 1 , 
     * 			 : 1 , 
     */
    public class DieLockDemo {
    	public static void main(String[] args) {
    		DieLock dl1 = new DieLock(true);
    		DieLock dl2 = new DieLock(false);
    
    		dl1.start();
    		dl2.start();
    	}
    }
    

    (4) 두 스레드가 각각의 자물쇠를 사용하여 문제가 발생했습니다.

  • 스레드dl1은 자물쇠 A로'if objA'를 출력한 다음에 스레드dl2에 의해 CPU 자원을 빼앗겨 막혔다.
  • 이때 스레드dl2는 자물쇠 B로'else objB'를 출력한 다음에 스레드dl1에 의해 CPU 자원을 빼앗겨 막혔다.
  • 이때 라인dl1은 다음 말을 계속 실행하려고 했지만 B 자물쇠가 필요했다. B 자물쇠는 이때 라인dl2에 의해 점용되어 막혔다.
  • 이때 만약에 라인dl2가 CPU 자원을 빼앗아 계속 아래로 실행하려고 한다면 라인dl1이 점용하고 있는 자물쇠 A가 필요하기 때문에 막힐 수밖에 없다.
  • 순서대로 자물쇠가 사라지는 문제가 발생한다.

  •  
     

    좋은 웹페이지 즐겨찾기