쓰레드에서 동기화할때 Synchronized Block대신에 메소드에 Synchronized할때 더 좋은 점이 있을까요?

쓰레드에서 Synchronized Block보다 Synchronized 메소드가 더 좋은 예좀 보여주세요.

1답변

  • 좋아요

    0

    싫어요
    채택취소하기

    Synchronized메소드가 블록보다 나은 특별한 장점은 없습니다. 굳이 하나를 뽑자면 this라는 오브젝트 레퍼런스를 포함시킬 필요가 없다는건데 전 이게 장점은 아니죠...

    메소드:

    public synchronized void method() { // 블록이었으면 this를 넣어야 함
        ...
        ...
        ...
    } 
    

    블록 :

    public void method() { 
        synchronized( this ) { // this를 넣음
            ....
            ....
            ....
        }  
    }
    

    Block이 메소드보다 나은데요. Synchronized 블락이 메소드보다 많은면에서 유연합니다. 왜냐면 Synchronized 메소드는 메소드 전체의 락을 걸지만 블락은 다른객체를 사용하여 특정 부분에 락을 걸수 있기 때문입니다.

    //객체 전체를 잠금 
    ... 
    private synchronized void someInputRelatedWork() {
        ... 
    }
    private synchronized void someOutputRelatedWork() {
        ... 
    }
    

    Vs.

    // 특정 부분만 잠금
    Object inputLock = new Object();
    Object outputLock = new Object();
    
    private void someInputRelatedWork() {
        synchronize(inputLock) { 
            ... 
        } 
    }
    private void someOutputRelatedWork() {
        synchronize(outputLock) { 
            ... 
        }
    }
    

    또 Synchronized block을 사용하게 되면 밑의 코드처럼 메소드 내에서 필요한 부분만 락을 걸수있습니다.

     private void method() {
                ... 코드
                ... 코드          
            ... 코드
        synchronized( lock ) { 
                 ... 코드
                }
                ... 코드 
                ... 코드 
                ... 코드
                ... 코드
    }
    

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.