2011-10-05 2 views
7

다음 파일이 동일한 파일에 있습니다. run() 메서드를 동기화했습니다.여러 스레드를 동시에 실행할 수있는 동기화 된 메서드가있는 이유는 무엇입니까?

class MyThread2 implements Runnable { 
    Thread t; 

    MyThread2(String s) { 
     t=new Thread(this,s); 
     t.start(); 
    } 

    public synchronized void run() { 
     for (int i=0;i<3;i++) { 
      System.out.println("Thread name : "+ Thread.currentThread).getName()); 
      try { 
       t.sleep(1000); 
      } 
      catch (InterruptedException e) { 
       e.getMessage(); 
      } 
     } 
    } 
} 

class TestSync { 
    public static void main(String[] args) { 
     MyThread2 m1=new MyThread2("My Thread 1"); 
     c.fun(); 
    } 
} 

class c { 
    static void fun() { 
     MyThread2 m1=new MyThread2("My Thread 4"); 
    } 
} 

출력은 내 질문은 왜 "내 스레드 1"과 동시에 "내 스레드 4"스레드 액세스를 모두 허용하는 방법을 동기화한다

Thread name : My Thread 1 
Thread name : My Thread 4 
Thread name : My Thread 4 
Thread name : My Thread 1 
Thread name : My Thread 1 
Thread name : My Thread 4 

입니까?

+2

당신이 게시 한 코드를 적어도 하나의 구문이 오류가 있으며 그대로 읽을 수 없습니다. 실제 코드를 게시하고 읽을 수 있도록 형식을 지정하십시오. – Mat

+0

오해는 인스턴스를 잠그는 대신에 메소드를 잠그고 있다는 것입니다. –

답변

27

synchronized 메서드는 인스턴스 수준에서 작동합니다. 클래스의 각 인스턴스는 자체 잠금을 가져옵니다. 인스턴스의 synchronized 메소드가 입력 될 때마다 잠금이 획득됩니다. 이렇게하면 동일한 인스턴스에 synchronized 메서드 을 호출하는 다중 스레드가이됩니다 (동일한 인스턴스에서 다른synchronized 메서드가 호출되지 않음).

이제 클래스의 인스턴스가 두 개이므로 각 인스턴스마다 자체 잠금이 설정됩니다. 각각의 인스턴스에서 동시에 작동하는 두 개의 스레드를 막을 수있는 방법은 없습니다. 당신이이 문제를 방지하려는 경우

, 당신은 obj이 클래스의 두 인스턴스가 공유하는 오브젝트 것 run(), 내부 synchronized(obj) 블록 수 :

class MyThread2 implements Runnable { 
    private static final Object lock = new Object(); 
    ... 
    public void run() { 
    synchronized(lock) { 
     ... 
    } 
    } 
} 
+0

답변을 주셔서 감사합니다 – user980089

+0

클래스 및 다중 스레드 인스턴스가 하나만있는 경우 일부 'synchronized' 메서드를 동시에 실행할 수 있습니까? – Sajad

+0

@ssss : 확실 :'정적'vs '정적이 아닌', 다른 잠금 기능을 가진'동기화 된 '블록 사용. 추가 정보가 필요하면 새로운 질문을 게시하십시오. – NPE