Object의 wait (), notify (), notify All (), Thread의sleep (),join () 및 yield ()

3077 단어
1. Object의 wait(), notify() 및 notifyAll()
주로 다중 스레드 상황에서 액세스 공유 자원의 사용을 동기화하는 데 사용된다.
wait () 함수를 호출하면 현재 스레드가 대기 상태에 있습니다. notify () 또는 notify All () 방법을 사용하거나 wait () 함수를 호출할 때 시간 초과 타임아웃을 설정하고 시간 초과가 되어야만 이 대상에 막힌 스레드를 깨우고 실행할 수 있습니다.
즉 웨이트 () 또는 notify () 는 대상의 '잠금 표지' 를 조작하고, 웨이트 () 가 실행되면 그 라인은 그 라인이 차지하는 '잠금 표지' 를 방출하여 다른 라인이 같은 대상에 잠긴 synchronized 동기화 함수나 동기화 블록에 접근할 수 있도록 한다.
즉wait()이나 notify()는 주로synchronized 키워드와 함께 사용됩니다.
2.synchronized 키워드
synchronized 키워드에 대한 목적은 동기화 제어를 하는 것이다. 한 라인만 들어갈 수 있고 다른 라인이synchronized 동기화 코드 블록에 접근해야 할 때 이전의 라인이 실행되기를 기다려야 한다. synchronized 동기화 블록을 떠나거나 wait를 호출해야 접근해야 하는synchronized 코드 블록에 들어갈 수 있다.
사용하는 관건은 모든 라인이 같은 대상에 잠겨 있는지 확인하는 것입니다. 그렇지 않으면 서로 다른 대상에 잠겨 있는 여러 라인이synchronized 코드 블록에 접근하는 데 아무런 영향을 주지 않습니다.
그래서 여기 잠긴 대상은 보통 **.class, this 또는 Object 객체에 있습니다.
예를 들면 다음과 같습니다.
2.1 Class 객체에 잠깁니다.
이렇게 하면 다른 루틴은 이 클래스의 다른 정적 synchronized 방법을 호출하거나 synchronized(Foo.class)에 잠긴 코드를 실행할 수 없지만, 이 클래스에 있는 다른 클래스가 아닌 클래스 대상에 잠긴 코드 블록을 호출할 수 있습니다.
public synchronized static void method1()   //  static     
{
 //TODO  
}   
public void method2()   
{   
   synchronized(Foo.class)  
}   

2.2 this 대상에 잠금
public synchronized void method1()   //     
{
 //TODO  
}   
public void method2()   
{   
   synchronized(this)  
} 

2.3 Object 객체와 같은 기타 객체
예:
private Object object1 = new Object();
public void execute(){
    synchronized(object1){
       //TODO
    }
}

2.4 synchronized 동기화 방법과 synchronized 동기화 코드 블록의 차이점:
1)synchronized 동기화 방법은 굵은 입자의 병렬 제어로 어느 순간에 한 라인만 이 synchronized 방법을 실행할 수 있다.
2)synchronized 동기화 코드 블록은 더욱 세밀한 병렬 제어로 이 코드 블록을 잠그고 코드 블록 바깥의 코드는 접근할 수 있다.
3. 자바 JDK5에서 세 가지 방식으로 스레드 안전ThreadLocal,synchronized,Lock을 보장할 수 있다.
3.1 ThreadLocal 
공간을 시간으로 바꾸는 전략을 채택하여 모든 라인에 해당하는 복사본을 만든다.
3.2 synchronized 
방법이나 코드 블록에서 공유된 접근이 필요한 자원을 동기화 제어할 수 있다.
3.3 Lock 
synchronized 방법보다 처리량이 더 좋습니다
synchronized
1) 현대 블록이 동기화되어 기다리지 않으려면 unlock을 진행할 수 있고synchronized는 실현할 수 없습니다.
2) Lock의 성능은 우수하며 경쟁이 치열한 상황에서 더욱 좋은 성능을 제공합니다.
4. Thread의join,sleep,yield4.1join() 방법은 주로 이 라인을 완전히 끝내고 라인이 실행된 후에join() 뒤의 문장을 실행하는 데 사용된다.
   public final void join() throws InterruptedException {
        VMThread t = vmThread;
        if (t == null) {
            return;
        }


        synchronized (t) {
            while (isAlive()) {
                t.wait();
            }
        }
    }

4.2 sleep() 
현재 스레드가 CPU 사용권을 넘겨주고, 일정 시간 동안 실행을 멈추며, 같은 우선순위나 낮은 우선순위 스레드가 실행될 수 있도록 합니다.
4.3 yield()
작용은sleep와 유사하다.
그: 현재 같은 우선순위의 라인이 실행 가능한 상태인지 먼저 검사하고 있으면 CPU의 점유권을 이 라인에 맡긴다. 그렇지 않으면 원래의 라인을 계속 운행한다.
운행 기회는 같은 등급의 다른 라인에 양보되었다.
그러나 다음과 같은 차이점이 있습니다.
1) sleep는 현재 라인을 일정 시간 휴면시킨 후 실행 불가 상태를 진행하고, 내보낸 시간은 프로그램 설정이 가능하며, yield는 설정할 수 없습니다.
2) yield가 실행된 후에도 현재 스레드는 실행 가능한 상태이기 때문에 낮은 우선순위의 스레드가 CPU 사용권을 가져올 수 없습니다.

좋은 웹페이지 즐겨찾기