2012-04-05 2 views
4

안녕하세요, 다음 코드에서 동기화 된 코드가 스레드에 대한 액세스를 제한하는지 설명 할 수 있습니다. "예"인 경우 "msg"대신 모니터 객체로 "this"를 사용한 경우와 어떻게 다릅니 까?동기화 된 블록 및 모니터 개체

public void display(String msg)  
{  
    synchronized(msg)  
    {  
     for(int i=1;i<=20;i++)  
      {  
       System.out.println("Name= "+msg);  
      } 
    } 
} 
+0

참조하십시오. http://stackoverflow.com/questions/574240/synchronized-block-vs-synchronized-method –

+0

음 ... 한 예로, 전달 된 객체의 모니터를 사용하고 있습니다. 다른 하나는 ... 인스턴스의 모니터를 사용하고 있습니다. –

답변

9

두 개의 스레드가 동일한 MSG 목적이 메소드를 호출 할 경우에만 차단 쓴 방법.

에서 동기화하는 경우이은 지정된 시간에 하나의 스레드 만 메소드를 호출 할 수 있습니다.

6
synchronized(this) 

은이 개체 인스턴스에서만 잠금을 의미합니다. 이 객체 인스턴스를 사용하여이 메소드를 호출하는 스레드가 여러 개있는 경우 한 번에 하나의 스레드 만 동기화 된 블록 내에서 액세스 할 수 있습니다.

synchronized(msg) 

은 msg 문자열에 대한 잠금을 의미합니다. 이 객체 인스턴스를 사용하는이 스레드를 여러 개 가지고이 메서드를 호출하면 msg가 다른 인스턴스 인 경우 여러 스레드가이 동기화 된 블록 내에서 액세스 할 수 있습니다. 놀라운 효과를 피하기 위해 Java가 문자열 동등성을 처리하는 방법에주의하십시오.

+0

+1 자바 객체의 효과를 언급에 대한 평등 –

0

에서 다음 코드에 동기화 된 코드는 스레드

에 에 대한 액세스를 제한됩니다. 동일한 String 개체 (실제로이 String 개체에서 동기화 된 모든 블록)에서 블록을 한 번 이상 동시에 호출 할 수 없습니다. 우리가이 경우에, "이"모니터 객체 대신 "MSG"의 로

synchronized(this)가 동일한 개체로 모든 블록에 대한 동시 액세스를 방지 사용한 경우에서

는 어떻게 다른 , 메서드의 this 인 개체는 동기화 된 블록에 두 번 들어갈 수 없습니다. 예위한

[자바 같은 의사 코드를 사용하여]

MyObject o = new MyObject(); 
Thread1: 
o.display("s1"); 
Thread2: 
o.display("s2"); 
:

s1 = s2; 
Thread1: 
MyObject o = new MyObject(); 
o.display(s1); 
Thread2: 
MyObject o = new MyObject(); 
o.display(s2); 

현재 방법은 블록

그러나 Thread1과 Thread2가 동시에 호출 할 수 없습니다

사이에 차단 동작이 표시되지 않습니다. - 모니터는 서로를 방해하지 않고 각 "s1"및 "s2"에 의해 잡혀 있습니다. .

관련 문제