java synchronized keyword는 객체에 대한 lock 이죠??

흠..
며칠전에 회사에서 synchronized keyword로 얘기를 하다가 그냥 말았다..
메쏘드(임계영역)만 lock이 걸리는 형태로 알고 있으셔서 흠..

아래 코드를 돌려보자..
아래와 같은 메세지를 뿌려준다.. 즉, 아래 코드의 singleton 객체에 대한 락은 묵시적으로 Monitor객체를 취득하고 메쏘드를 빠져나가면 반환하는 구조로 되어 있는데 말이다..

따라서, 메쏘드 01에 진입을 하게 되면, 02는 01이 완료될때까지 대기를 하다가 01이 완료되면 02메쏘드가 불리게 되는 그런 구조이다..

print01 call
print01 진입
print02 call
print01
print02 진입
print02

package net.sjava.test.sync;

public class SyncTestMain {
   
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new Thread(){
            public void run() {
                SingleTon instance = SingleTon.getInstance();
                System.out.println(“print01 call”);
                instance.print01();           
            }
        }.start();
       
        new Thread(){
            public void run() {
                SingleTon instance = SingleTon.getInstance();
                System.out.println(“print02 call”);
                instance.print02();           
            }
        }.start();
   
    }
}

package net.sjava.test.sync;

public class SingleTon {

    private static SingleTon instance = new SingleTon();
   
    private SingleTon() {
       
    }
   
    public static SingleTon getInstance() {
        return instance;
    }
   
    public synchronized void print01() {
        System.out.println(“print01 진입”);
        try {
            Thread.sleep(5000);
            System.out.println(“print01”);
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
   
    public synchronized void print02() {   
        System.out.println(“print02 진입”);
        try {
            Thread.sleep(1000);
            System.out.println(“print02”);
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

* reference
 – http://iilii.egloos.com/4071694

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.