동기 화 된 노트

더 읽 기
동기 화 된 노트
1. synchronized 인 스 턴 스 방법
synchronized void method(){
  ...
}

기능 적 으로 그것 은
void method() {
     synchronized (this) {
	...
    }
}

2. synchronized 클래스 방법
class Something {
   static synchronized void method(){
     ...
   }
}

기능 적 으로 그것 은
class Something {
    static void method() {
      synchronized (Something.class){
       ...
    }
  }
}

3. 우리 도 synchronized 와 유사 한 기능 을 실현 할 수 있 는 방법 을 사용자 정의 할 수 있다 면 코드 는 다음 과 같 습 니 다.
void method() {
    lock();
    try{
       ...
    }finally{
       unlock();
    }
}

이상 의 코드 는 Before / After Pattern 의 실현 방식 입 니 다.
예:
아래 에서 Mutex 류 는 공유 와 배척 을 하 는 메커니즘 으로 일반적으로 mutex 라 고 부른다.
public class Gate {
    private int counter = 0;
    private String name = "Nobody";
    private String address = "Nowhere";
    private final Mutex mutex = new Mutex();
    public void pass(String name, String address) { //   synchronized
        mutex.lock();
        try {
            this.counter++;
            this.name = name;
            this.address = address;
            check();
        } finally {
            mutex.unlock();
        }
    }
    public String toString() { //   synchronized
        String s = null;
        mutex.lock();
        try {
            s = "No." + counter + ": " + name + ", " + address;
        } finally {
            mutex.unlock();
        }
        return s;
    }
    private void check() {
        if (name.charAt(0) != address.charAt(0)) {
            System.out.println("***** BROKEN ***** " + toString());
        }
    }
}

디자인 이 간단 한 Mutex 클래스 1:
public final class Mutex {
    private boolean busy = false;
    public synchronized void lock() {
        while (busy) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }
        busy = true;
    }
    public synchronized void unlock() {
        busy = false;
        notifyAll();
    }
}

완벽 한 디자인 의 Mutex 클래스 2:
public final class Mutex {
    private long locks = 0;
    private Thread owner = null;
    public synchronized void lock() {
        Thread me = Thread.currentThread();
        while (locks > 0 && owner != me) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }
        // locks == 0 || owner == me
        owner = me;
        locks++;
    }
    public synchronized void unlock() {
        Thread me = Thread.currentThread();
        if (locks == 0 || owner != me) {
            return;
        }
        // locks > 0 && owner == me
        locks--;
        if (locks == 0) {
            owner = null;
            notifyAll();
        }
    }
}

4. 우 리 는 synchronized 블록 을 볼 때 'synchronized 는 무엇 을 보호 하 는 것 입 니까?' 라 고 생각 한 다음 에 '누구의 잠 금 을 가 져 와 서 보호 하 는 것 입 니까?' 라 고 생각해 야 합 니 다.
   synchronized 인 스 턴 스 방법의 순종 을 호출 하려 면 thid 의 잠 금 을 가 져 옵 니 다.하나의 인 스 턴 스 잠 금 은 같은 시간 에 하나의 스 레 드 만 얻 을 수 있 습 니 다.
   인 스 턴 스 가 다 르 면 잠 금 도 달라 집 니 다.synchronized 블록 을 사용 할 때 특히 '누구의 잠 금 을 가 져 와 서 보호 하 는 지' 를 고려 해 야 합 니 다.... 때문에
   synchronized 는 가 져 올 대상 의 잠 금 을 명확 하 게 밝 혀 야 합 니 다.예 를 들 면:
 
 synchronized (obj) {
     ...
   }

  이러한 프로그램 코드 에서 obj 는 우리 가 잠 겨 있 는 대상 을 가 져 오 는 것 입 니 다.이 대상 이 잘못 쓰 지 않도록 조심 하 세 요. 잘못된 대상 의 잠 금 을 가 져 오 면 자신 을 보호 하고 싶 습 니 다.
  자기 집 은 남 의 집 문 을 잠 갔다.
주: 코드 는 자바 다 중 스 레 드 디자인 모델 제1장 SingleThreaded Execution 에서 나 온 내용 입 니 다.

좋은 웹페이지 즐겨찾기