[Java] 동시성 레벨

naneun·2022년 2월 26일
0

Java

목록 보기
3/7
post-thumbnail

클래스 레벨

  • synchronized(xxxxx.Class)

    Class Sample {
    		  int x;
    		  double y;
    		  String s;
    
    		  public void func() {
    			  synchronized(Sample.class) { ... }
    		  }
    }
    
    Sample a = new Sample(), b = new Sample(), c = new Sample();
  1. Sample 클래스 타입의 인스턴스가 여러개[ a, b, c ] 존재한다고 가정하자.
  2. 이러한 인스턴스들이 func 라는 메서드를 호출한다고 하자. [ a.func(), b.func(), c.func() ]
  3. 순차적으로 호출되는 것이 아니라 각각 다른 스레드에서 호출되고 있다고 가정하자.
  4. a.func() 를 호출한 스레드 A 가 cpu 자원도 할당 받아 실행 중이라 가정하자.
  5. a.func 가 실행이 종료되기 전에 cpu 자원을 스레드 B에게 뺐겼다고 가정하자
  6. b.func() 를 호출하려는 스레드 B 가 cpu 자원을 할당받는다 하더라도 b.func() 는 바로 호출되지 않는다. 왜? 같은 클래스의 메서드를 호출한 a.func() 가 몸체 내의 블록으로 인해 Sample.class 에 대한 락을 지니고 있기 때문
  • 주의: a.func() 호출 시 Sample.class 자체에 락이 걸리기 때문에 인스턴스 b 는 func() 메서드 외에도 Sample 클래스에 정의된 다른 자원에 접근할 수 없다.
    Sample.class 내의 모든 자원에 대한 접근 권한을 하나의 스레드만 가질 수 있음. func() 만 호출 못하는 게 아님.

객체 레벨

  • synchronized(this) { ... }

  • Composition 관계일 때는 synchronized(참조 변수 이름) { ... }

    Class Sample {
    		  int x;
    		  double y;
    		  String s;
    
    		  public void func() {
    			  synchronized(this) { ... }
    		  }
    }
    
    Sample a = new Sample(), b = new Sample(), c = new Sample();
  1. 위와 동일
  2. 위와 동일
  3. 위와 동일
  4. 위와 동일
  5. 위와 동일
  6. b.func() 를 호출하려는 스레드 B 는 cpu 자원을 할당받아 해당 메서드( b.func() ) 를 실행할 수 있다. 왜? 객체마다 락이 걸려있기 때문 (a 와 b 는 같은 클래스이지만 다른 객체이다)
  • 주의: 현재 자원을 할당 받은 스레드에서 객체 b는 b.func() 외에도 자신의 인스턴스 변수와 메서드에 접근할 수 있지만 a.func() 가 아직 종료되지 않은 상황이므로 현재 스레드는 a.func() 외에도 a 의 어떠한 인스턴스 변수, 메서드에도 접근할 수 없다.

메서드 레벨[ public synchronized method() ]:

Class Sample {
	  public synchronized void func() {
		
	  }
}

객체 내에서 해당 메서드 단위로 락이 걸림.

  • static 메서드에 synchronized 가 붙었을 시 클래스 레벨인 이유
    • 해당 메서드는 클래스 명으로 호출이 가능하고 객체에 종속되는 것이 아니라서
profile
riako

0개의 댓글